本题要求实现带头结点的链式表操作集。 函数接口定义: List MakeEmpty(); Position Find( List L, ElementType X ); bool Insert( List L, ElementType X, Position P ); bool Delete( List L, Position P );
时间: 2023-12-14 20:35:41 浏览: 113
链表是一种常用的数据结构,它由一系列节点组成,每个节点包含一个数据元素和指向下一个节点的指针。链表可以分为带头结点和不带头结点两种,其中带头结点的链表在实现上更为方便。
以下是带头结点的链表操作集的函数接口定义:
```c
typedef int ElementType;
typedef struct Node *PtrToNode;
struct Node {
ElementType Data;
PtrToNode Next;
};
typedef PtrToNode List;
typedef PtrToNode Position;
List MakeEmpty(); // 初始化一个带头结点的空链表
Position Find(List L, ElementType X); // 在链表L中查找值为X的节点,返回该节点的位置,若找不到则返回NULL
bool Insert(List L, ElementType X, Position P); // 在链表L中插入值为X的节点,插入位置为P的后面,若插入成功则返回true,否则返回false
bool Delete(List L, Position P); // 在链表L中删除位置为P的节点,若删除成功则返回true,否则返回false
```
下面是带头结点的链表操作集的实现:
```c
#include <stdio.h>
#include <stdlib.h>
typedef int ElementType;
typedef struct Node *PtrToNode;
struct Node {
ElementType Data;
PtrToNode Next;
};
typedef PtrToNode List;
typedef PtrToNode Position;
List MakeEmpty() {
List L = (List)malloc(sizeof(struct Node));
L->Next = NULL;
return L;
}
Position Find(List L, ElementType X) {
Position P = L->Next;
while (P != NULL && P->Data != X) {
P = P->Next;
}
return P;
}
bool Insert(List L, ElementType X, Position P) {
Position TmpCell = (Position)malloc(sizeof(struct Node));
TmpCell->Data = X;
TmpCell->Next = P->Next;
P->Next = TmpCell;
return true;
}
bool Delete(List L, Position P) {
Position Tmp;
if (P == NULL) {
return false;
}
Tmp = P->Next;
P->Next = Tmp->Next;
free(Tmp);
return true;
}
int main() {
List L = MakeEmpty();
Insert(L, 1, L);
Insert(L, 2, L->Next);
Insert(L, 3, L->Next);
Position P = Find(L, 2);
Delete(L, P);
P = Find(L, 3);
Delete(L, P);
P = Find(L, 1);
printf("%d\n", P->Data); // 输出1
free(L);
return 0;
}
```
阅读全文