链表操作的简单实现.docx
- 文档编号:28520238
- 上传时间:2023-07-18
- 格式:DOCX
- 页数:17
- 大小:48.12KB
链表操作的简单实现.docx
《链表操作的简单实现.docx》由会员分享,可在线阅读,更多相关《链表操作的简单实现.docx(17页珍藏版)》请在冰豆网上搜索。
链表操作的简单实现
#include
#include
#include
#include
typedefstructNode
{
intdata;
structNode*next;
}Node,*LinkList;
LinkListLinkListCreat(void);
intLinkListPrint(LinkListp);
intLinkListDelete(LinkListp);
intLinkListFind(LinkListp);
LinkListLinkListCombine(LinkListp);
intLinkListNodes(LinkListp);
intLinkListInsert(LinkListp);
//创建链表
LinkListLinkListCreat(void)
{
charch;
//定义head为头指针
LinkListp,head;
head=(LinkList)malloc(sizeof(Node));
//内存分配不成功,程序退出
if(!
head)
{
printf("分配内存不成功,创建链表失败。
");
getch();
returnNULL;
}
//内存分配成功后,先将head指向空指针
elsehead=NULL;
intn,i;
intnumber;
printf("请输入您要求创建链表的结点个数:
");
//当输入有误时,重新输入
while(scanf("%d",&n)!
=1)
{
printf("您输入的数据有误,请重新输入(整型).");
//舍弃掉无用的字符串
while(ch=getchar()!
='\n')
continue;
}
//舍弃掉无用的字符串
while(ch=getchar()!
='\n')
{
continue;
}
printf("输入您要写入的数据(整数):
");
//向链表中写入整型据
for(i=0;i { //输入整型数据有误时,舍弃后重新输入 while(scanf("%d",&number)! =1) { printf("您输入的数据有误,请重新输入(整型)."); while(ch=getchar()! ='\n') continue; } //给指针p分配一块内存 p=(LinkList)malloc(sizeof(Node)); if(! p) { //分配不成功时,返回空指针 printf("分配内存不成功,创建链表失败。 "); returnNULL; } //运用头插法创建链表 p->data=number; p->next=head; head=p; } printf("写入数据成功.\n"); //返回该链表的头指针 returnhead; } //定义链表的输出函数 intLinkListPrint(LinkListp) { p=p->next; //判断链表是否为空 if(! p) { printf("该链表为空链表,没有可供打印的数据.\n"); return0; } else //用循环输出链表中的值 while(p) { printf("%5d",p->data); p=p->next; } printf("\n"); return1; } //定义链表的删除函数,选择某个结点进行删除 intLinkListDelete(LinkListp) { charch; //count用于计数,判断n与count是否相等,n是第n个结点,用flag判断scanf的返回值 inti,count,n,flag; LinkLista,b; count=0; //先将flag赋值为0,若输入n值有效时,flag=1 flag=0; //用b指向p b=p; //调用查找连表中结点的函数,方便用户判断输入n值的范围 n=LinkListNodes(p); //空链表时,退出 if(! p->next) { printf("该链表为空链表,删除前请先初始化! \n"); return0; } else { printf("请您输入对应的n值: "); //输入的n值不是有效的时,舍弃输入,提示用户重新输入 while((flag=scanf("%d",&i))! =1||i<=0||i>n) { if(1==flag&&(i<=0||i>n)) { printf("您输入的n值范围应该在1到%d之间,请您重新输入: \n",n); } else { printf("您输入的n值有误,请重新输入(整型): "); while(ch=getchar()! ='\n') { continue; } } } //舍弃用户在输入例如24假设这种情况下,2已有效,舍弃后面4的值,以免影响用户下一步操作 while(ch=getchar()! ='\n') { continue; } while(b->next) { //使a指向要删除的b结点前面的一个结点 a=b; b=b->next; count++; //当查找到第n个结点时,退出循环 if(count==i) break; } } a->next=a->next->next; //释放b结点 free(b); printf("删除成功.\n"); return1; } intLinkListFind(LinkListp) { //n为查找的第n个结点,count用于计数结点进行判断 intn,count; LinkListb; b=p; count=0; printf("请输入您要查找的第n个元素: "); scanf("%d",&n); //链表为空时,退出查找 if(! p->next) { printf("该链表为空,查找元素失败! \n"); return0; } else //用循环查找第n个元素 while(b) { b=b->next; count++; if(n==count) break; } //查找的n值不满足结点个数要求时,退出查找 if(n>count||n { printf("您输入的n值有误,查找失败! \n"); return1; } //否则,输出查找的值 else { printf("查找成功: %5d\n",b->data); } return1; } //定义两个链表进行有序表的合并函数 LinkListLinkListCombine(LinkListp) { //q为新创建的链表,head新创建链表的头指针,a1,a2,f分别用于原始链表和新创建的链表中 LinkListq,head,a1,a2; LinkLista; //为head指针分配一块动态内存 head=(LinkList)malloc(sizeof(Node)); //方便判断是否为空表 head->next=NULL; //调用LinkListCreat()函数,创建新链表 q=LinkListCreat(); if(q) { //新链表创建成功时,为其加上头指针 head->next=q; } else { //新链表创建不成功时,退出 printf("链表写入数据失败,程序已退出."); returnNULL; } //a指向原始链表的头指针 a=p; //a1,a2分别指向对应头指针的下一个结点 a1=p->next; a2=head->next; printf("打印原始链表元素: "); //调用LinkListPrint()打印原始链表 LinkListPrint(p); printf("\n打印新创建的链表的元素: "); //调用LinkListPrint()打印新链表 LinkListPrint(head); //当指针a1,a2均不为空时,进行循环 while(a1&&a2) { //a1结点中元素小于a2中结点元素时 if(a1->data<=a2->data) { //p->next连接a1结点 p->next=a1; p=a1; //a1指针继续向后移动 a1=a1->next; } else { //p->next连接a2 p->next=a2; p=a2; //a2指针向后移动 a2=a2->next; } } //如果新链表中有数据剩余,将p->next连接到指针a2 if(a2) p->next=a2; //否则,连接到指针a1 else p->next=a1; printf("\n打印有序合并两个链表后的元素: "); //打印有序合并后的两个链表 LinkListPrint(a); returna; } intLinkListNodes(LinkListp) { intcount=0; p=p->next; //循环用count计数结点 while(p) { count++; p=p->next; } if(count) { printf("当前链表有%d个结点.\n",count); } else { printf("当前链表为空链表,请您先进行初始化,否则没有结点."); } returncount; } intLinkListInsert(LinkListp) { intnum,count,n; charch; LinkListh,o,t; if(! p->next) { printf("该链表为空链表,请您插入新的元素时,先初始化."); return0; } printf("请输入对应的i: "); n=LinkListNodes(p); while(scanf("%d",&num)! =1||num<=0||num>n) { if(num<=0||num>n) { printf("不能找到第%d个结点,您插入数据的位置应该在1到%d之间,请您重新输入.\n",num,n); } while(ch=getchar()! ='\n') { continue; } printf("您输入的i值有误,请重新输入(整型)"); } count=0; t=p; h=(LinkList)malloc(sizeof(structNode)); if(! t->next) { printf("该链表为空链表,请先初始化! \n"); return0; } else while(t) { o=t; t=t->next; count++; if(count==num) break; } printf("第%d个位置已经查找到,请您输入对应的数据(整型): ",num-1); scanf("%d",&h->data); o->next=h; h->next=t; printf("插入元素成功.\n"); return1; } intmain() { intch; LinkListp,head; head=(LinkList)malloc(sizeof(Node)); head->next=NULL; intnum; while (1) { system("CLS"); printf("\t请输入对应整数选择实现的功能: \n"); printf("1.向单向链表中写入数据(逆序).\n"); printf("2.将链表中数据打印.\n"); printf("3.在第i个结点前,插入一个新的结点.\n"); printf("4.删除第n个结点.\n"); printf("5.查找连表中的第m个元素.\n"); printf("6.向一个新的连表中写入数据,并实现两个链表个的有序合并.\n"); printf("7.查找当前链表中的结点个数.\n"); printf("0.退出当前程序.\n"); printf("请您输入对应的整数: "); while(scanf("%d",&num)! =1||num<0||num>7) { while(ch=getchar()! ='\n') { continue; } printf("您的输入有误,您输入对应的整数,选择实现的功能! \n"); printf("请您输入对应的整数: "); } switch(num) { case1: p=LinkListCreat(); if(p) { head->next=p; } else { printf("链表写入数据失败."); } printf("按任意键继续\n"); getch(); break; case2: LinkListPrint(head); printf("按任意键继续\n"); getch(); break; case3: LinkListInsert(head); printf("按任意键继续\n"); getch(); break; case4: LinkListDelete(head); printf("按任意键继续\n"); getch(); break; case5: LinkListFind(head); printf("按任意键继续\n"); getch(); break; case6: LinkListCombine(head); printf("按任意键继续\n"); getch(); break; case7: LinkListNodes(head); printf("按任意键继续\n"); getch(); break; default: exit(0); } } return0; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作 简单 实现
![提示](https://static.bdocx.com/images/bang_tan.gif)