链表的基本操作
2016-05-17 21:19
459 查看
#include <stdio.h> #include <stdlib.h> #include <stdbool.h> //链表的函数声明 struct Node; typedef struct Node *PtrToNode; typedef PtrToNode List; typedef PtrToNode Position; typedef int ElementType; List CreateList(); //创建链表 bool IsEmpty(List L); //检测链表是否为空 bool IsLast(Position P, List L); //检测是否为最后一个元素 Position Find(ElementType X, List L); //链表元素的查找 void Delete(ElementType X, List L); //链表元素的删除 Position FindPrevious(ElementType X, List L); //寻找(要删结点的)前一个元素 void Insert(ElementType X, List L, Position P); //链表元素的插入 void DeleteList(List L); //删除链表 Position Header(List L); //返回链表头结点 Position First(List L); //返回链表第一个元素 void printList(List L); //打印链表 struct Node { ElementType Element; Position Next; }; int main() { int number, flag; ElementType X, X2; Position P; List L; flag = 1; printf("| 链表的基本使用 |\n"); printf("|************************************|\n"); printf("| 1. 创建链表 |\n"); printf("| 2. 销毁链表 |\n"); printf("| 3. 元素的插入 |\n"); printf("| 4. 元素的删除 |\n"); printf("| 5. 元素的查找 |\n"); printf("| 6. 打印链表 |\n"); printf("|************************************|\n"); while (flag) { printf("请选择功能 : \n"); scanf("%d", &number); switch(number) { case 1 : L = CreateList(); break; case 2 : if (L) { DeleteList(L); } else printf("链表不存在!!!\n"); break; case 3 : if (L) { printf("请输入需要插入的元素和位置:"); printf("(如将X插到5后面则,输入X 5,第一次插入则输入 X, 0 )"); scanf("%d%d", &X, &X2); P = Find(X2, L); if (X2 != 0) { while (!P) { printf("该位置不存在!\n"); printf("请重新输入需要插入的元素和位置"); scanf("%d%d", &X, &X2); P = Find(X2, L); if (X2 == 0) break; } } Insert(X, L, P); } else printf("链表不存在!!!\n"); break; case 4 : if (L) { printf("请输入需要删除的元素:"); scanf("%d", &X); Delete(X, L); } else printf("链表不存在!!!\n"); break; case 5 : if (L) { printf("请输入需要查找的元素:"); scanf("%d", &X); if( Find(X, L)) printf("该元素存在!\n"); else printf("该元素不存在!\n"); } else printf("链表不存在!!!\n"); break; case 6 : if (L) { printf("链表中元素如下:"); printList(L); } else printf("链表不存在!!!\n"); break; default : printf("程序运行结束,请按任意键退出!!!\n"); flag = 0; } } } List CreateList() //创建链表 { List L; if (!(L = malloc(sizeof(struct Node)))) exit(-1); L->Next = NULL; return L; } void DeleteList(List L) //删除链表 { Position P, TmpCell; P = L->Next; L->Next = NULL; while ( P != NULL) { TmpCell = P->Next; free(P); P = TmpCell; } } bool IsEmpty(List L) //检查链表是否为空 { return L->Next == NULL; } Position Find(ElementType X, List L) //查找链表中的元素 { Position P; P = L->Next; while (P != NULL && P->Element != X) P = P->Next; return P; } 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); } } Position FindPrevious(ElementType X, List L) //返回前一个元素位置 (配合删除链表使用) { Position P; P = L; while (P->Next != NULL && P->Next->Element != X) P = P->Next ; return P; } void Insert(ElementType X, List L, Position P) //链表元素的插入 { Position TmpCell; if (!(TmpCell = malloc(sizeof(struct Node)))) exit(-1); if (P != NULL) { TmpCell->Element = X; TmpCell->Next = P->Next; P->Next = TmpCell; } else { //第一次插入 TmpCell->Element = X; TmpCell->Next = L->Next; L->Next = TmpCell; } } Position Header(List L) //返回头结点 { return L; } Position First(List L) //返回第一个元素 { return L->Next; } bool IsLast(Position P, List L) //检查该元素是否为链表最后一个元素 { return P->Next == NULL; } void printList(List L) //打印链表 { Position P; P = L->Next; while (P) { printf("%d -> ", P->Element ); P = P->Next; } printf("\n"); }
相关文章推荐
- 如何组织构建多文件 C 语言程序(二)
- [C/C++]反转链表
- 如何写好 C main 函数
- C#数据结构之顺序表(SeqList)实例详解
- C#实现基于链表的内存记事本实例
- Lua和C语言的交互详解
- Lua教程(七):数据结构详解
- C#模拟链表数据结构的实例解析
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#数据结构之队列(Quene)实例详解
- C#数据结构揭秘一
- C#数据结构之单链表(LinkList)实例详解
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C语言中fchdir()函数和rewinddir()函数的使用详解
- C语言内存对齐实例详解
- C语言编程中统计输入的行数以及单词个数的方法
- C语言自动生成enum值和名字映射代码