线性表 链表结构的实现

xiaoxiao2021-02-28  56

最近学习数据结构,练习实现线性表的链式存储结构的实现,实现了新建链表,计算链表长度,查找,插入,删除节点四个功能,代码如下:

#include "stdio.h" #include "stdlib.h" #define TRUE 1 #define FALSE 0 typedef int bool; typedef int ElementType; typedef struct LNode * PtrToLNode; struct LNode{ ElementType Data; PtrToLNode Next; }; typedef PtrToLNode List; typedef PtrToLNode Position; //以下所有函数都默认有头节点 List MakeEmpty();//创建一个带头节点的新链表 int Lenth(List L);//计算链表长度 ElementType FindKth(List L, int K);//找到链表中第K个元素并返回值 Position Find(List L, ElementType X);//按值查找,找到值为X的节点 bool Insert(List L, ElementType X, int i);//将值为x的节点插入位序为i的位置 bool Delete(List L, int i);//删除位序位i的节点 void PrintLiner(List L);//打印链表 int main() { List L = MakeEmpty(); while(1) { printf("请输入想要对链表L执行的操作:\n"); printf("1.计算链表长度\n2.打印链表\n"); printf("3.找到第K个节点并返回值\n4.找到值为K的节点并返回位置\n"); printf("5.在序位为i的位置插入值为X的节点\n6.删除序位为i的节点\n"); printf("0.退出程序\n"); int i; scanf("%d",&i); switch(i) { case 0: exit(-1);//参数为负数时退出程序 case 1: printf("链表长度为:%d\n",Lenth(L)); printf("\n\n\n"); break; case 2: PrintLiner(L); printf("\n\n\n"); break; case 3: printf("请输入节点序位(从1开始):\n"); int K; scanf("%d",&K); if(FindKth(L,K) > 0) printf("第%d节点值为:%d\n",K,FindKth(L,K)); else printf("位序不存在\n"); printf("\n\n\n"); break; case 4: printf("请输入要寻找的值(大于0):\n"); int N; scanf("%d",&N); Position tmp; tmp = Find(L,N); if(tmp) printf("该节点值为:%d\n",tmp->Data);//(因为返回的是地址,无法检测,故检测值是否为要找的值) printf("\n\n\n"); break; case 5: printf("请输入要插入的位置和值:\n"); int pos,num; scanf("%d %d",&pos, &num); Insert(L,num,pos); printf("\n\n\n"); break; case 6: printf("请输入要删除的位序(从1开始):\n"); int del; scanf("%d",&del); Delete(L,del); printf("\n\n\n"); break; default: break; } } return 0; } List MakeEmpty()//创建一个带头节点的新链表 { List L = (List)malloc(sizeof(List)); L->Data = 0;//头节点值为0 L->Next = NULL;//地址为空 return L; } int Lenth(List L) { int cnt = 0;//初始化计数器,因为有头节点,所以从0开始 Position p = L->Next;//指向第一个节点,L是头节点 while(p) { p = p->Next; cnt++; } return cnt; } ElementType FindKth(List L, int K)//找到链表中第K个元素并返回值 { Position p = L; int cnt = 0;//初始化计数器,因为有头节点,所以从0开始,若没有头节点则从1开始 while(p && cnt < K) { p = p->Next; cnt++; } if(p && cnt == K) return p->Data; else return -1; } Position Find(List L, ElementType X)//按值查找,找到值为X的节点 { Position p = L,tmp; while(p && p->Data != X) { p = p->Next; } if(p) return p; else return NULL; } bool Insert(List L, ElementType X, int i)//将值为x的节点插入位序为i的位置 { if(X <= 0) { printf("输入的值不合法\n"); return FALSE; } Position pre = L, tmp; int cnt = 0; while(pre && cnt < i - 1)//想要插入位序i的位置,就要找到i-1 { pre = pre->Next; cnt++; } if(pre && cnt == i - 1 ) { tmp = (Position)malloc(sizeof(Position));//申请一个新的节点 tmp->Data = X;//给节点赋值 tmp->Next = pre->Next;//将i-1之后的节点地址赋给新节点 pre->Next = tmp;//将新节点插入i-1之后 return TRUE; } else { printf("插入的位置不存在\n"); return FALSE; } } bool Delete(List L, int i)//删除位序位i(从1开始)的节点 { Position pre = L, tmp; int cnt = 0; while(pre && cnt < i - 1)//循环到第i-1个节点 { pre = pre->Next; cnt++; } if(pre == NULL || cnt != i-1 || pre->Next == NULL)//如果pre->Next为空,说明i-1为最后一个节点,第i个节点不存在 { printf("要删除的节点不存在\n"); return FALSE; } else { tmp = pre->Next; pre->Next = tmp->Next; free(tmp); return TRUE; } } void PrintLiner(List L)//打印链表 { Position p = L->Next;//因为有头节点,p为头节点之后第一个节点 while(p) { printf("%d ",p->Data); p = p->Next; } printf("\n");//换行 }

转载请注明原文地址: https://www.6miu.com/read-84608.html

最新回复(0)