1. 程式人生 > >6-1 線性表元素的區間刪除 (20 分)

6-1 線性表元素的區間刪除 (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元素可以通過>、==、<進行比較;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; } /* 你的程式碼將被嵌在這裡 */

我先把自己第一次程式碼貼出來吧,直接暴力,結果超時了

List Delete( List L, ElementType minD, ElementType maxD )
{
    int i=0
,j=0; while(i<=L->Last) {/*就是每有以為元素符合刪除條件就把當前元素後面的所有元素均向前移動一位,然後Last-1;*/ if(L->Data[i]>minD&&L->Data[i]<maxD) { j=i; while(j<=L->Last) { L->Data[j]=L->Data[j+1]; j++; } L->Last--; } else i++; } return L; }

第二次是 也是在同一個數組裡面操作,不同點在於沒有在發現符合刪除條件的元素直接把其後面的所有元素像第一種方法一樣向前移動,而是用count計數,然後遇到不符合刪除條件的元素,就把該元素向前移動count個單位,並替換掉Data[i-count];

List Delete( List L, ElementType minD, ElementType maxD )
{
    int i,count=0;
    for(i=0;i<=L->Last;i++)
    {
        if(L->Data[i]<maxD&&L->Data[i]>minD)//若當前元素在區間內,count+1 
            count++;
        else
            L->Data[i-count]=L->Data[i];/*若當前元素不在區間內,
            把當前元素向前移動count單位,並替換Data[i-count]*/ 
    }
    L->Last-=count;
    return L;
}