1. 程式人生 > >第1章第1節練習題5 無序表刪除指定區間值

第1章第1節練習題5 無序表刪除指定區間值

問題描述

從順序表中刪除其值在給定值s與t之間(包含s和t,要求s<t)的所有元素,如果s或t不合理或者順序表為空則顯示出錯資訊並退出執行。

演算法思想

注意理解題意,本題與練習題4是不同的,練習題4中說明了該順序表邏輯上有序,而本題中,邏輯上無序,因此刪除的時候不能採用與練習題4相同的解法。
本題可以從前往後掃描順序表,用k表示值不在s和t之間的下標,則data[k]記錄其值不在s和t之間的數。而當其值在s和t之間時,k的值保持不變;若不在s和t之間時,即本題中需要保留的數,對k進行自增;最後只需重置順序表的表長即可。

演算法描述

void Delst(SqList *L, ElemType s, ElemType t){
    int
k=0; for(int i=0;i<L->length;i++){ if(L->data[i]>t||L->data[i]<s){ L->data[k++]=L->data[i]; } } L->length=k; }

具體程式碼見附件

附件

#include<stdio.h>
#define MaxSize 100
typedef int ElemType;

typedef struct{
    ElemType data[MaxSize];
    int
length; }SqList; int Delst(SqList*, ElemType, ElemType); void print(SqList*); int main(int argc, char* argv[]) { SqList SL; SL.length=10; SL.data[0]=8;SL.data[1]=0;SL.data[2]=1;SL.data[3]=5;SL.data[4]=2; SL.data[5]=4;SL.data[6]=9;SL.data[7]=3;SL.data[8]=7;SL.data[9]=6; int flag; ElemType s=3
, t=8; print(&SL); flag=Delst(&SL, s, t); print(&SL); if(flag==0){ printf("Del success! \n"); }else{ printf("Del false! \n"); } return 0; } int Delst(SqList *L, ElemType s, ElemType t){ int k=0; if(s>t||L->length==0){ printf("The number is illegal! \n"); return -1; } for(int i=0;i<L->length;i++){ if(L->data[i]>t||L->data[i]<s){ L->data[k++]=L->data[i]; } } L->length=k; return 0; } void print(SqList*L){ for(int i=0;i<L->length;i++){ printf("%d\t",L->data[i]); } printf("\n"); }