鏈式表操作集
阿新 • • 發佈:2022-04-16
鏈式表操作集
本題要求實現鏈式表的操作集
函式介面定義
Position Find( List L, ElementType X );
List Insert( List L, ElementType X, Position P );
List Delete( List L, Position P );
其中List結構定義如下
typedef struct LNode *PtrToLNode; struct LNode { ElementType Data; PtrToLNode Next; }; typedef PtrToLNode Position; typedef PtrToLNode List;
各個操作函式的定義為:
Position Find( List L, ElementType X )
:返回線性表中首次出現X的位置。若找不到則返回ERROR;
List Insert( List L, ElementType X, Position P )
:將X插入在位置P指向的結點之前,返回連結串列的表頭。如果引數P指向非法位置,則列印“Wrong Position for Insertion”,返回ERROR;
List Delete( List L, Position P )
:將位置P的元素刪除並返回連結串列的表頭。若引數P指向非法位置,則列印“Wrong Position for Deletion”並返回ERROR。
裁判測試程式樣例
#include <stdio.h> #include <stdlib.h> #define ERROR NULL typedef int ElementType; typedef struct LNode *PtrToLNode; struct LNode { ElementType Data; PtrToLNode Next; }; typedef PtrToLNode Position; typedef PtrToLNode List; Position Find( List L, ElementType X ); List Insert( List L, ElementType X, Position P ); List Delete( List L, Position P ); int main() { List L; ElementType X; Position P, tmp; int N; L = NULL; scanf("%d", &N); while ( N-- ) { scanf("%d", &X); L = Insert(L, X, L); if ( L==ERROR ) printf("Wrong Answer\n"); } scanf("%d", &N); while ( N-- ) { scanf("%d", &X); P = Find(L, X); if ( P == ERROR ) printf("Finding Error: %d is not in.\n", X); else { L = Delete(L, P); printf("%d is found and deleted.\n", X); if ( L==ERROR ) printf("Wrong Answer or Empty List.\n"); } } L = Insert(L, X, NULL); if ( L==ERROR ) printf("Wrong Answer\n"); else printf("%d is inserted as the last element.\n", X); P = (Position)malloc(sizeof(struct LNode)); tmp = Insert(L, X, P); if ( tmp!=ERROR ) printf("Wrong Answer\n"); tmp = Delete(L, P); if ( tmp!=ERROR ) printf("Wrong Answer\n"); for ( P=L; P; P = P->Next ) printf("%d ", P->Data); return 0; } /* 你的程式碼將被嵌在這裡 */
輸入樣例
6
12 2 4 87 10 2
4
2 12 87 5
輸出樣例
2 is found and deleted.
12 is found and deleted.
87 is found and deleted.
Finding Error: 5 is not in.
5 is inserted as the last element.
Wrong Position for Insertion
Wrong Position for Deletion
10 4 2 5
程式碼
Position Find(List L, ElementType X) {
PtrToLNode p = L; /* 將表頭的位置給p */
while (p) { /* 遍歷整個連結串列 */
if (p->Data == X) /* 如果在p位置的Data等於X,則返回p的位置 */
return p;
p = p->Next; /* 更新p */
}
return ERROR;
}
List Insert(List L, ElementType X, Position P) {
PtrToLNode TmpCell, p = L; /* 將表頭的位置給p */
TmpCell = (PtrToLNode) malloc(sizeof(struct LNode)); /* 為插入節點開闢一個新的空間 */
TmpCell->Data = X; /* 初始化結點TmpCell */
TmpCell->Next = NULL;
if (p == P) { /* 插入位置等於表頭位置,在表頭前插入 */
TmpCell->Next = L; /* 則插入節點的Next指向原來的表頭L */
return TmpCell; /* 最後返回新的表頭 */
}
while (p) { /* 通過p遍歷連結串列L */
if (p->Next == P) { /* 如果存在P的前驅結點 */
p->Next = TmpCell; /* 前驅節點的Next指向新節點 */
TmpCell->Next = P; /* 新節點的Next指向P */
return L; /* 最後返回表頭 */
}
p = p->Next;/* 更新p */
}
printf("Wrong Position for Insertion\n");
return ERROR;
}
List Delete(List L, Position P) {
PtrToLNode p = L;
if (p == P) { /* 如果刪除位置在表頭 */
p = p->Next; /* 更新表頭為下一個 */
free(L); /* 釋放原來表頭的空間 */
return p;
}
while (p) {
if (p->Next == P) { /* 找到了P的前驅結點p */
p->Next = P->Next; /* 使前驅節點的Next指向P的下一個 */
free(P); /* 釋放結點P的空間 */
return L;
}
p = p->Next; /* 更新p */
}
printf("Wrong Position for Deletion\n");
return ERROR;
}