1. 程式人生 > 其它 >習題3.3 線性表元素的區間刪除 (20 分)

習題3.3 線性表元素的區間刪除 (20 分)

以前我也是一個小白,寫這些東西也十分吃力,慢慢到後面就會了 Data structure 是一門非常複雜的課,至少對我來說 慢慢的學明白,堅持下去一定會有成果, 加油,學習人 習題3.3 線性表元素的區間刪除 (20 分)

給定一個順序儲存的線性表,請設計一個函式刪除所有值大於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

元素可以通過>、==、<進行比較;minDmaxD分別為待刪除元素的值域的下、上界。函式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 
結尾無空行 作者 DS課程組 單位 浙江大學 程式碼長度限制 16 KB 時間限制 200 ms 記憶體限制 ------------------------------------------------------------------------------------------------------------------------------------------

//第一種方法 複雜度NlogN
// List Delete( List L, ElementType minD, ElementType maxD )
// {
// int i=0,j;
// List LL = L;
// for(;i<=LL->Last;i++)
// {
// if(LL->Data[i]<maxD&&LL->Data[i]>minD)
// {
// for(j=i;j<LL->Last;j++)
// LL->Data[j] = LL->Data[j+1];
// LL->Last--;
// i--;
// }
// }
// return LL;
// }

//第二種方法 自我實現,時間複雜度O(N),但空間O(N)
// List Delete( List L, ElementType minD, ElementType maxD )
// {
// int i,j=0;
// List LL = (List)malloc(sizeof(struct LNode));
// LL->Last = 0;
// for(i=0;i<=L->Last;i++)
// {
// if(!(L->Data[i]>minD&&L->Data[i]<maxD))
// {
// LL->Data[LL->Last++] = L->Data[i];
// }
// }
// LL->Last--;
// return LL;
// }

//第三種 time complex O(N) space complex O(1)
List Delete( List L, ElementType minD, ElementType maxD )
{
int i,j=0;
for(i=0;i<=L->Last;i++)
{
if(L->Data[i]<=minD||L->Data[i]>=maxD)
{
L->Data[j++] = L->Data[i];
}
}
L->Last = j - 1;
return L;
}