资源预览内容
第1页 / 共9页
第2页 / 共9页
第3页 / 共9页
第4页 / 共9页
第5页 / 共9页
第6页 / 共9页
第7页 / 共9页
第8页 / 共9页
第9页 / 共9页
亲,该文档总共9页全部预览完了,如果喜欢就下载吧!
资源描述
ex2:链表的插入与删除1)首先创建一个单链表:从键盘读入五个整数,按输入顺序形成单链表。将创建好的链表元素依次输出到屏幕上。2)在已创建好的链表中插入一个元素:从键盘读入元素值和插入位置,调用插入函数完成插入操作。然后将链表元素依次输出到屏幕上。3)在已创建好的链表中删除一个元素:从键盘读入欲删除的元素位置(序号),调用删除函数完成删除操作。然后将链表元素依次输出到屏幕上。 4)从键盘任意输入一个整数,在单链表中查询该数,如果单链表中已经存在这个数,就调用删除函数,删除该元素所在结点,并将单链表在删除前后的数据元素依次输出到屏幕上;如果单链表中不存在这个数,就调用插入函数,将这个数插入到单链表尾,并将单链表在插入前后的数据元素依次输出到屏幕上软件技术基础上机实验报告上机实验 二Ex2_1(链表的创建和插入删除)#include#include typedef struct node_type /定义链点 int data;struct node_type *next;node_type;typedef struct list_type /定义链表 node_type *head;node_type *tail;int length; list_type;int read()int x;scanf(%d,&x);return x;void error(int x)switch(x)case 1:printf(nthe place of the data is wrong ,please input the place againn);break;void creat_list(list_type *lianbiao)/创建链表 node_type *p,*s;/注意此处的指针要为链点结构体类型 int x;lianbiao-head=(node_type*)malloc(sizeof(node_type);lianbiao-length=0;p=lianbiao-head;while(lianbiao-lengthdata=x;p-next=s;p=s;/在链点连接上出现了问题导致后面显示链表时也出问题 lianbiao-length+;p-next=NULL;lianbiao-tail=p; void show_list(list_type *lianbiao)/把链表元素打印出来 node_type *p;p=lianbiao-head-next;printf(nThe linked list isnn);while(p!=NULL)printf(%d ,p-data);p=p-next;/p往下走一步 printf(nThe length of this linked list is %dn,lianbiao-length);void insert_list(list_type *lianbiao,int newdata,int place)node_type *newnode,*p;int i=0;newnode=(node_type*)malloc(sizeof(node_type);newnode-data=newdata;p=lianbiao-head; while(lianbiao-length+1place|place1)/判断插入的位置是否正确 error(1);place=read();/位置错误则重新输入位置 while(inext;i+;newnode-next=p-next;/插入链点 p-next=newnode;if(newnode-next=NULL)lianbiao-tail=newnode;/若插入的位置为表尾,则改变尾指针 lianbiao-length+;void delete_list(list_type *lianbiao,int place)int i=0;node_type *p,*g;p=lianbiao-head;while(placelianbiao-length|place1)/检查删除元素的位置是否符合要求 error(1);place=read();while(inext;i+;g=p-next;p-next=p-next-next;/删除链点 free(g);if(p-next=NULL)/若删除的是最后一个元素,则改变尾指针的指向 lianbiao-tail=p;lianbiao-length-;/链表长度自减一 void search_list(list_type *lianbiao,int number )/寻找那个整数 node_type *p;int i=0;int m;m=lianbiao-length;/记录原来链表的长度 p=lianbiao-head;while(p-next!=NULL)/p如果指向最后一个元素,则跳出循环 while(p-next-data=number)delete_list(lianbiao,i+1);/p的下一个元素如果是这个数,那么删除if(p-next=NULL)/若p已经指向最后一个那么跳出删除的循环 break;if(p-next!=NULL)/若p没有指向最后一个那么让p指向下一个 p=p-next;i+;if(i=m)/若链表中元素没有与指定数相同的,则将数插入链表 insert_list(lianbiao,number,m+1);void main()list_type lianbiao; int newdata,place; int del_place; int number; printf(please input the the listn);creat_list(&lianbiao);/创建链表 ,把链表这一包含头和尾的指针传过去 show_list(&lianbiao);/而没有像书上一样传链点 printf(nplease input the new datan);newdata=read();printf(please input the place of the new data where it should ben);place=read();insert_list(&lianbiao,newdata,place);show_list(&lianbiao);printf(nplease input the place of the number which will be deletedn);del_place=read();delete_list(&lianbiao,del_place);show_list(&lianbiao);printf(nplease input the number that you want to searchn);number=read();search_list(&lianbiao,number);show_list(&lianbiao);输出数据如图所示录入五个数插入一个数删除一个数查找一个数,如果链表中有数与之相同,则删除这些数问题及解决方法问题1:创建链表时定义的指向结构体的指针没有定义为结构体类型解决方法:将原先定义的int型改为结构体的类型注意:指向结构体的指针要定义为结构体类型问题2:未给链点动态分配空间注意:定义一个结构体变量只分配一个结构体空间,而不是整个链表的空间都分配了,链表中每个链点的空间要动态申请解决方法:没用一个链点前动态分配一个空间问题3:定义了一个链表结构类型的的变量,但未定义或动态分配空间给该变量内部head指针所指向的结构体便直接访问该结构体,导致错误。解决方法:再另动态分配空间给该指针变量所指向的结构体注意:结构体定义时并未分配空间,系统给某指针分配了空间不代表给他的指向变量也分配了空间。问题4:创建链表时各链点未衔接。解决方法:再增加一个指针握住原链表。注意:在使用动态分配空间增加链点时要使用两个指针,其中一个作为动态空间的指向,另一个握住原已经形成的链表。并且,要注意分析链表时从中间开始去考虑问题4:用scanf时输入不进数遗漏了“&”!解决方法:加上。注意:scanf如果多输了数,它会把值赋给下面的scanf,并且中间程序照跑;总结:编程前要先想好思路,列出流程,写出核心的算法。对于链表类的程序,要先想模型,并且先从链表中间开始想思路,再想边界的问题。注意删除链点后动态空间要释放。程序太完美啦!
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号