給定一個順序存儲的線性表,請設計一個函數刪除所有值大於min而且小於max的元素。刪除后表中剩余元素保持順序存儲,並且相對位置不能改變。
函數接口定義:
List Delete( List L, ElementType minD, ElementType maxD );
其中List
結構定義如下:
typedef int Position; typedef struct LNode *List; struct LNode { ElementType Data[MAXSIZE]; Position Last; /* 保存線性表中最后一個元素的位置 */ };
L
是用戶傳入的一個線性表,其中ElementType
元素可以通過>、=、<進行比較;minD
和maxD
分別為待刪除元素的值域的下、上界。函數Delete
應將Data[]
中所有值大於minD
而且小於maxD
的元素刪除,同時保證表中剩余元素保持順序存儲,並且相對位置不變,最后返回刪除后的表。
裁判測試程序樣例:
#include <stdio.h> #define MAXSIZE 20 typedef int ElementType; typedef int Position; typedef struct LNode *List; struct LNode { ElementType Data[MAXSIZE]; Position Last; /* 保存線性表中最后一個元素的位置 */ }; List ReadInput(); /* 裁判實現,細節不表。元素從下標0開始存儲 */ void PrintList( List L ); /* 裁判實現,細節不表 */ List Delete( List L, ElementType minD, ElementType maxD ); int main() { List L; ElementType minD, maxD; int i; L = ReadInput(); scanf("%d %d", &minD, &maxD); L = Delete( L, minD, maxD ); PrintList( L ); return 0; } /* 你的代碼將被嵌在這里 */
輸入樣例:
10
4 -8 2 12 1 5 9 3 3 10
0 4
輸出樣例:
4 -8 12 5 9 10
解題思路:遍歷整個線性表,並記錄和保存小於等於minD和大於等於maxD的元素
設置2個標識i,j ,其中i不斷的右移,j指向左端,若L->data[i]符合條件,則將L->data[j]=L->data[j];j++
最后將 L->last = j-1;
List Delete( List L, ElementType minD, ElementType maxD ) { Position n = L->Last ; int j=0; for(int i=0;i<=n;i++) { if(L->Data[i]<=minD || L->Data[i] >= maxD)//注意條件 { L->Data[j]=L->Data[i]; j++; } } L->Last = j-1; return L; }//歡迎評論