导言
本文用C++实现了链表的创建、插入、删除、遍历、判断空链表等操作。当然根据大学课程安排,C++的学习可能在链表之后(或同时进行),不过本文提供的代码几乎没有涉及C++的特性,开辟内存空间也使用的是C语言的方法,除了输入输出的部分,本代码完全可以被认为是C语言描述。(我做的意大利面,即使是不能吃辣的人也能吃哦!)(?)
正文
头文件List.h的声明
#ifndef _List_H
struct Node;
typedef struct Node *PtrToNode;
typedef PtrToNode List;
typedef PtrToNode Position;
typedef int ElementType;
int IsEmpty(List L);
int IsLast(Position P,List L);
Position Find(ElementType X, List L);
List Create();
void Delete(ElementType X, List L);
Position FindPrevious(ElementType X, List L);
void Insert(ElementType X, List L, Position P);
void DeleteList(List L);
void traverse(List L);
#endif
定义Node为链表节点的结构体
定义PtrToNode、List、Position均为指向节点的指针
定义节点中存储的数据类型是int型
Node的结构
本例及以下代码均放在.cpp文件中
//本实现全程默认链表带有头节点
struct Node {
ElementType element;
Position next;
};
element是节点存储的数据项
next是指向下一节点的指针
创建链表
//创建一个链表
List Create() {
Position Header,TmpCell;
Header = (Position)malloc(sizeof(struct Node));
TmpCell = Header;
int n;
cout << "请输入元素个数:";
cin >> n;
cout << "请输入全部元素:";
for(int i = 0; i < n; i++) {
int X;
cin >> X;
Position P;
P = (Position)malloc(sizeof(struct Node));
P->element = X;
P->next = NULL;
TmpCell->next = P;
TmpCell = TmpCell->next;
}
return Header;
}
判断空链表
//测试一个链表是否是空表
int IsEmpty(List L) {
return L->next == NULL;
}
判断链表末尾
//测试当前位置是否为链表的末尾
int IsLast(Position P, List L) {
return P->next == NULL;
}
查找元素
//返回X元素在链表中的位置;如果没找到返回NULL
Position Find(ElementType X, List L) {
Position P = L->next;
while (P->element != X&&P != NULL) {
P = P->next;
}
return P;
}
删除元素
//删除链表中第一个出现的元素X
void Delete(ElementType X, List L) {
Position P, TmpCell;
P = FindPrevious(X, L);
if (!IsLast(P, L)) {
TmpCell = P->next;
P->next = TmpCell->next;
free(TmpCell);
}
}
//返回元素X前面一个元素的位置
Position FindPrevious(ElementType X, List L) {
Position P;
P = L;
while (P->next != NULL&&P->next->element != X) {
P = P->next;
}
return P;
}
插入元素
插入元素的命令有多种形式,这里仅实现“在给定位置后插入”的功能
//在位置P之后插入元素X
void Insert(ElementType X, List L, Position P) {
Position TmpCell;
TmpCell = (Position)malloc(sizeof(struct Node));
if (TmpCell == NULL)
cout << "空间不足!" << endl;
TmpCell->element = X;
TmpCell->next = P->next;
P->next = TmpCell;
}
删除整个链表
//删除整个链表
void DeleteList(List L) {
Position P, TmpCell;
P = L->next;
L->next = NULL;
while (P != NULL) {
TmpCell = P->next;
free(P);
P = TmpCell;
}
}
遍历链表
//遍历链表
void traverse(List L) {
Position P = L->next;
cout << "遍历:";
while (P != NULL) {
cout << P->element;
if (P->next != NULL)cout << " ";
P = P->next;
}
cout << endl;
}
运行演示
int main() {
List L;
L = Create();
traverse(L);
cout << "删除元素3" << endl;
Delete(3, L);
traverse(L);
cout << "在开头插入元素5" << endl;
Insert(5, L, L);
traverse(L);
return 0;
}
总结
本文实现了链表,比较适合供①已经了解链表特性但时间太久忘记实现细节②临近C语言课设作业ddl的朋友们参考。
参考资料:《数据结构与算法分析:C语言描述》(第二版)