数据结构单链表的插入和删除.docx
- 文档编号:6742467
- 上传时间:2023-01-09
- 格式:DOCX
- 页数:14
- 大小:75.42KB
数据结构单链表的插入和删除.docx
《数据结构单链表的插入和删除.docx》由会员分享,可在线阅读,更多相关《数据结构单链表的插入和删除.docx(14页珍藏版)》请在冰豆网上搜索。
数据结构单链表的插入和删除
单链表的插入和删除实验日志
指导教师刘锐实验时间2010年10月11日
学院数理专业数学与应用数学
班级学号姓名实验室S331-A
实验题目:
单链表的插入和删除
实验目的:
了解和掌握线性表的逻辑结构和链式存储结构,掌握单链表的基本算法及相关的时间性能分析。
实验要求:
建立一个数据域定义为字符串的单链表,在链表中不允许有重复的字符串;根据输入的字符串,先找到相应的结点,后删除之。
实验主要步骤:
1、分析、理解程序(相关程序见附录)。
2、调试程序,并设计输入字符串数据(如:
aa,bb,cc,dd,ee,#),测试程序的如下功能:
不允许重复字符串的插入;根据输入的字符串,找到相应的结点并删除。
3、修改程序:
(1)增加插入结点的功能。
(2)将建立链表的方法改为头插入法。
实验结果:
1、不允许重复字符串的插入功能结果如下:
2、删除结点的功能结果如下:
3、删除和插入结点的功能如下:
4、头插法建立链表的功能如下:
心得体会:
通过这次实验我学会了单链表的建立和删除,基本了解了线性表的逻辑结构和链式存储结构,掌握了单链表的基本算法,使我受益匪浅。
在调试程序的过程中,遇见了一系列的问题,后来在同学的帮助下,修改了几个语句后,终于把它给调试出来了。
有时候一个标点符号的问题就可能导致程序无法运行。
所以在分析调试程序的时候一定要仔细。
附加程序代码:
1、调试之后的程序如下(其中蓝色字体部分为修改过的):
#include"stdio.h"
#include"string.h"
#include"stdlib.h"
#include"ctype.h"
typedefstructnode//定义结点
{
chardata[10];//结点的数据域为字符串
structnode*next;//结点的指针域
}ListNode;
typedefListNode*LinkList;//自定义LinkList单链表类型
LinkListCreatListR1(void);//函数,用尾插入法建立带头结点的单链表
ListNode*LocateNode(LinkListhead,char*key);//函数,按值查找结点
voidDeleteList(LinkListhead,char*key);//函数,删除指定值的结点
voidDeleteAll(LinkListhead);//函数,删除所有结点,释放内存
voidprintlist(LinkListhead);//函数,打印链表中的所有值
//================主函数=================
voidmain()
{
charch[100],num[100];
LinkListhead;
head=CreatListR1();//用尾插入法建立单链表,返回头指针
printf("利用尾插法建立没有重复的单链表如下:
\n");
printlist(head);//遍历链表输出其值
A:
printf("Deletenode(y/n):
");//输入"y"或"n"去选择是否删除结点
scanf("%s",num);
if(strcmp(num,"y")==0||strcmp(num,"Y")==0){
printf("PleaseinputDelete_data:
");
scanf("%s",ch);//输入要删除的字符串
DeleteList(head,ch);
printlist(head);
}
else
{
printf("输入错误!
请重新输入!
");
gotoA;
}
DeleteAll(head);//删除所有结点,释放内存
}
//==========用尾插入法建立带头结点的单链表===========
LinkListCreatListR1(void)
{
charch[10];
LinkListhead=(LinkList)malloc(sizeof(ListNode));//生成头结点
ListNode*s,*r,*pp;
r=head;
r->next=NULL;
printf("Input#toend");//输入"#"代表输入结束
printf("PleaseinputNode_data:
");
scanf("%s",ch);//输入各结点的字符串
while(strcmp(ch,"#")!
=0)
{
pp=LocateNode(head,ch);//按值查找结点,返回结点指针
if(pp==NULL)//没有重复的字符串,插入到链表中
{
s=(ListNode*)malloc(sizeof(ListNode));
strcpy(s->data,ch);
r->next=s;
r=s;
r->next=NULL;
}
printf("Input#toend");
printf("PleaseinputNode_data:
");
scanf("%s",ch);
}
returnhead;//返回头指针
}
//===========打印链表============
voidprintlist(LinkListhead)
{
ListNode*p=head->next;//从开始结点打印
while(p)
{
printf("%s,",p->data);
p=p->next;`
}
printf("\n");
}
//==========按值查找结点,找到则返回该结点的位置,否则返回NULL==========
ListNode*LocateNode(LinkListhead,char*key)
{
ListNode*p=head->next;//从开始结点比较
while(p&&strcmp(p->data,key)!
=0)//直到p为NULL或p->data为key止
p=p->next;//扫描下一个结点
returnp;//若p=NULL则查找失败,否则p指向找到的值为key的结点
}
//==========删除带头结点的单链表中的指定结点=======
voidDeleteList(LinkListhead,char*key)
{
ListNode*p,*r,*q=head;
p=LocateNode(head,key);//按key值查找结点的
if(p==NULL)
{//若没有找到结点,退出
printf("positionerror");
exit(0);
}
while(q->next!
=p)//p为要删除的结点,q为p的前结点
q=q->next;
r=q->next;
q->next=r->next;
free(r);//释放结点
}
//==========删除所有结点,释放空间===========
voidDeleteAll(LinkListhead)
{
ListNode*p=head,*r;
while(p->next)
{
r=p->next;
free(p);
p=r;
}
free(p);
}
2、修改之后(增加插入结点的功能;将建立链表的方法改为头插入法)的程序如下:
#include"stdio.h"
#include"string.h"
#include"stdlib.h"
#include"ctype.h"
#defineboolint
#definefalse0
#definetrue1
//================定义链表中的结点=================
typedefstructnode
{
chardata[10];//定义结点的数据域为字符串
structnode*next;//结点的指针域
}ListNode;
typedefListNode*LinkList;//自定义LinkList单链表类型
LinkListCreatListR1();//函数,用尾插法建立带头结点的单链表
LinkListCreatListR2();//函数,用头插法建立带头结点的单链表
ListNode*LocateNode(LinkListhead,char*key);//函数,按值查找结点
voidDeleteList(LinkListhead,char*key);//函数,删除指定值的结点
voidDeleteAll(LinkListhead);//函数,删除所有结点,释放内存
voidprintlist(LinkListhead);//函数,打印链表中的所有值
voidInsert(LinkListhead);//函数,插入指定的字符串
voidShowMenu1();
voidShowMenu2();
//================主函数=================
voidmain()
{
charx,y,ch[100];
LinkListhead;
boolquit=false;
A:
ShowMenu1();
scanf("%s",&x);
if(x=='1')head=CreatListR1();
elseif(x=='2')head=CreatListR2();
elsegotoA;
while(!
quit)
{
ShowMenu2();
scanf("%s",&y);
switch(y)
{
case'0':
quit=true;break;
case'1':
printf("请输入要删除的字符串:
");
scanf("%s",ch);
DeleteList(head,ch);break;
case'2':
Insert(head);break;
default:
break;
}
}
DeleteAll(head);//删除所有结点,释放内存
}
//================主菜单=================
voidShowMenu1()
{
printf("\n=====================================================\n\n");
printf("1.利用尾插法建立单链表\n");
printf("2.利用头插法建立单链表\n");
printf("\n======================================================\n");
printf("请选择:
");
}
voidShowMenu2()
{
printf("\n=====================================================\n\n");
printf("1.删除结点\n");
printf("2.插入结点\n");
printf("0.退出\n");
printf("\n======================================================\n");
printf("请选择:
");
}
//==========用尾插法建立带头结点的单链表===========
LinkListCreatListR1(void)
{
charch[100];
LinkListhead=(LinkList)malloc(sizeof(ListNode));//生成头结点
ListNode*s,*r,*pp;
r=head;
r->next=NULL;
printf("Input#toend!
\n");//输入"#"代表输入结束
printf("PleaseinputNode_data:
");
scanf("%s",ch);//输入各结点的字符串
while(strcmp(ch,"#")!
=0)
{
pp=LocateNode(head,ch);//按值查找结点,返回结点指针
if(pp==NULL)//没有重复的字符串,插入到链表中
{
s=(ListNode*)malloc(sizeof(ListNode));
strcpy(s->data,ch);
r->next=s;
r=s;
r->next=NULL;
}
printf("PleaseinputNode_data:
");
scanf("%s",ch);
}
printf("\n恭喜,利用尾插法建立单链表成功!
所建单链表如下:
\n");
printlist(head);
returnhead;
}
//==========用头插入法建立带头结点的单链表===========
LinkListCreatListR2(void)
{
charch[100];
ListNode*s,*r,*pp;
LinkListhead=(LinkList)malloc(sizeof(ListNode));//生成头结点
r=head;
r->next=NULL;
printf("Input#toend!
\n");//输入"#"代表输入结束
printf("PleaseinputNode_data:
");
scanf("%s",ch);//输入各结点的字符串
while(strcmp(ch,"#")!
=0)
{
pp=LocateNode(head,ch);//按值查找结点,返回结点指针
if(pp==NULL)//没有重复的字符串,插入到链表中
{
s=(ListNode*)malloc(sizeof(ListNode));
strcpy(s->data,ch);
s->next=r->next;
r->next=s;
}
printf("PleaseinputNode_data:
");
scanf("%s",ch);
}
printf("\n恭喜,利用头插法建立单链表成功!
所建单链表如下:
\n");
printlist(head);
returnhead;
}
//===========打印链表============
voidprintlist(LinkListhead)
{
ListNode*p=head->next;//从开始结点打印
if(!
p)printf("链表为空!
");
else
{
while(p)
{
printf("%s",p->data);
p=p->next;
}
}
printf("\n");
}
//==========按值查找结点,找到则返回该结点的位置,否则返回NULL==========
ListNode*LocateNode(LinkListhead,char*key)
{
ListNode*p=head->next;//从开始结点比较
while(p&&strcmp(p->data,key)!
=0)//直到p为NULL或p->data为key止
p=p->next;//扫描下一个结点
returnp;//若p=NULL则查找失败,否则p指向找到的值为key的结点
}
//==========删除带头结点的单链表中的指定结点=======
voidDeleteList(LinkListhead,charkey[100])
{
ListNode*p,*r,*q=head;
p=LocateNode(head,key);//按key值查找结点的
if(p==NULL)
{//若没有找到结点,退出
printf("Positionerror!
\n");
exit(0);
}
while(q->next!
=p)//p为要删除的结点,q为p的前结点
q=q->next;
r=q->next;
q->next=r->next;
free(r);//释放结点
printf("删除字符串%s后新链表为:
",key);
printlist(head);
}
//=========申请新的内存空间,插入新结点========
voidInsert(LinkListhead)
{
ListNode*s,*p;
intn;
printf("请输入要插入的字符串:
");
s=(LinkList)malloc(sizeof(ListNode));
s->next=NULL;
p=(LinkList)malloc(sizeof(ListNode));
p->next=NULL;
scanf("%s",s->data);
printf("请输入要插入的位置:
");
scanf("%d",&n);
for(p=head;n>0;p=p->next,n--);
s->next=p->next;
p->next=s;
printf("在第%d个位置后插入字符串%s后新链表为:
",n+1,s);
printlist(head);
}
//==========删除所有结点,释放空间===========
voidDeleteAll(LinkListhead)
{
ListNode*p=head,*r;
while(p->next)
{
r=p->next;
free(p);
p=r;
}
free(p);
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 单链表 插入 删除