链表的基本操作

来源:互联网 发布:管家婆软件免费版教程 编辑:程序博客网 时间:2024/06/01 21:46
#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);} elseprintf("链表不存在!!!\n"); break;case 4 :if (L) {printf("请输入需要删除的元素:");scanf("%d", &X);Delete(X, L);} elseprintf("链表不存在!!!\n"); break; case 5 :if (L) {printf("请输入需要查找的元素:");scanf("%d", &X);if( Find(X, L))                          printf("该元素存在!\n");                      else                          printf("该元素不存在!\n"); } elseprintf("链表不存在!!!\n"); break;case 6 :if (L) {printf("链表中元素如下:");printList(L); } elseprintf("链表不存在!!!\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");} 

0 0
原创粉丝点击