List MakeEmpty() { List L = (List)malloc(sizeof(List)); L->Next=NULL; return L; } Position Find( List L, ElementType X ) { L=L->Next; while(L) { if(L->Data==X) { return L; } L=L->Next; } return ERROR; } bool Insert( List L, ElementType X, Position P ) { List p = (List)malloc(sizeof(List)); p->Data=X; p->Next=NULL; List k=L; while(k) { if(k->Next==P) { p->Next=P; k->Next=p; return true; } k=k->Next; } printf("Wrong Position for Insertion\n"); return false; } bool Delete( List L, Position P ) { if(L==P){ L=L->Next; return true; } while(L) { if(L->Next==P) { L->Next=P->Next; return true; } L=L->Next; } printf("Wrong Position for Deletion\n"); return false; }
时间: 2024-01-16 17:05:47 浏览: 148
这是一个基本的链表操作的 C 语言实现。其中包含了四个函数:MakeEmpty、Find、Insert 和 Delete。
MakeEmpty 函数用于创建一个空的链表,它返回一个指向链表头结点的指针。
Find 函数用于在链表中查找是否存在某个元素 X,如果找到则返回该元素所在结点的指针,否则返回 ERROR(这里 ERROR 可以是一个宏定义或者一个常量)。
Insert 函数用于在链表的某个位置 P(指向链表中某个结点的指针)处插入一个元素 X。如果找到了位置 P,则将新结点插入到 P 的后面。如果没有找到位置 P,则插入失败。
Delete 函数用于删除链表中某个位置 P 处的结点。如果 P 是链表的头结点,则不能删除,返回删除失败。否则,在链表中查找是否存在位置 P,并将 P 的前一个结点与 P 的后一个结点连接起来,然后释放 P 所在的内存空间。
以上是对这些函数的简单介绍,你可以根据需要进行更详细的了解和学习。
相关问题
本题要求实现带头结点的链式表操作集。 函数接口定义: List MakeEmpty(); Position Find( List L, ElementType X ); bool Insert( List L, ElementType X, Position P ); bool Delete( List L, Position P );
链表是一种常用的数据结构,它由一系列节点组成,每个节点包含一个数据元素和指向下一个节点的指针。链表可以分为带头结点和不带头结点两种,其中带头结点的链表在实现上更为方便。
以下是带头结点的链表操作集的函数接口定义:
```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;
}
```
List MakeEmpty():创建并返回一个空的顺序表;C语言,;利用静态分配
在C语言中,如果要创建一个空的顺序表(动态内存分配),你可以使用类似于以下的方法:
```c
// 定义一个结构体表示顺序表节点
typedef struct {
int data;
struct Node *next;
} ListNode;
// 创建一个空顺序表的函数
ListNode* ListMakeEmpty() {
// 使用静态分配(这里不适用,因为顺序表通常使用动态内存)
// 如果要用静态分配,可以这样:
// static ListNode table[0]; // 这里定义一个空数组来代表空表
// 因为顺序表的大小通常是未知的,所以通常我们会动态分配
// 动态分配方式
ListNode *emptyList = NULL; // 初始化一个指向NULL的指针作为头节点
emptyList->next = NULL; // 设置头节点的下一个节点为NULL,表示表为空
return emptyList;
}
```
请注意,这个函数返回的是一个指向首节点的指针,而不是整个表的大小。如果你需要知道表的实际大小,你可能需要添加额外的逻辑来跟踪节点数量。
阅读全文