数据结构单链表的插入和删除.docx

上传人:b****6 文档编号:6742467 上传时间:2023-01-09 格式:DOCX 页数:14 大小:75.42KB
下载 相关 举报
数据结构单链表的插入和删除.docx_第1页
第1页 / 共14页
数据结构单链表的插入和删除.docx_第2页
第2页 / 共14页
数据结构单链表的插入和删除.docx_第3页
第3页 / 共14页
数据结构单链表的插入和删除.docx_第4页
第4页 / 共14页
数据结构单链表的插入和删除.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

数据结构单链表的插入和删除.docx

《数据结构单链表的插入和删除.docx》由会员分享,可在线阅读,更多相关《数据结构单链表的插入和删除.docx(14页珍藏版)》请在冰豆网上搜索。

数据结构单链表的插入和删除.docx

数据结构单链表的插入和删除

单链表的插入和删除实验日志

指导教师刘锐实验时间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);

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1