数据结构单链表的插入和删除Word文档格式.docx
《数据结构单链表的插入和删除Word文档格式.docx》由会员分享,可在线阅读,更多相关《数据结构单链表的插入和删除Word文档格式.docx(14页珍藏版)》请在冰豆网上搜索。
有时候一个标点符号的问题就可能导致程序无法运行。
所以在分析调试程序的时候一定要仔细。
附加程序代码:
1、调试之后的程序如下(其中蓝色字体部分为修改过的):
#include"
stdio.h"
string.h"
stdlib.h"
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:
Deletenode(y/n):
"
//输入"
y"
或"
n"
去选择是否删除结点
scanf("
%s"
num);
if(strcmp(num,"
)==0||strcmp(num,"
Y"
)==0){
PleaseinputDelete_data:
scanf("
ch);
//输入要删除的字符串
DeleteList(head,ch);
printlist(head);
}
else
{
输入错误!
请重新输入!
"
gotoA;
}
DeleteAll(head);
//删除所有结点,释放内存
}
//==========用尾插入法建立带头结点的单链表===========
LinkListCreatListR1(void)
charch[10];
LinkListhead=(LinkList)malloc(sizeof(ListNode));
//生成头结点
ListNode*s,*r,*pp;
r=head;
r->
next=NULL;
Input#toend"
#"
代表输入结束
PleaseinputNode_data:
//输入各结点的字符串
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;
scanf("
returnhead;
//返回头指针
//===========打印链表============
voidprintlist(LinkListhead)
ListNode*p=head->
next;
//从开始结点打印
while(p)
printf("
%s,"
p->
data);
p=p->
`
//==========按值查找结点,找到则返回该结点的位置,否则返回NULL==========
ListNode*LocateNode(LinkListhead,char*key)
//从开始结点比较
while(p&
&
strcmp(p->
data,key)!
=0)//直到p为NULL或p->
data为key止
p=p->
//扫描下一个结点
returnp;
//若p=NULL则查找失败,否则p指向找到的值为key的结点
//==========删除带头结点的单链表中的指定结点=======
voidDeleteList(LinkListhead,char*key)
ListNode*p,*r,*q=head;
p=LocateNode(head,key);
//按key值查找结点的
if(p==NULL)
{//若没有找到结点,退出
positionerror"
exit(0);
while(q->
next!
=p)//p为要删除的结点,q为p的前结点
q=q->
r=q->
q->
next=r->
free(r);
//释放结点
//==========删除所有结点,释放空间===========
voidDeleteAll(LinkListhead)
ListNode*p=head,*r;
while(p->
next)
r=p->
free(p);
p=r;
free(p);
2、修改之后(增加插入结点的功能;
将建立链表的方法改为头插入法)的程序如下:
#defineboolint
#definefalse0
#definetrue1
//================定义链表中的结点=================
typedefstructnode
//定义结点的数据域为字符串
}ListNode;
typedefListNode*LinkList;
LinkListCreatListR1();
//函数,用尾插法建立带头结点的单链表
LinkListCreatListR2();
//函数,用头插法建立带头结点的单链表
voidDeleteList(LinkListhead,char*key);
voidInsert(LinkListhead);
//函数,插入指定的字符串
voidShowMenu1();
voidShowMenu2();
charx,y,ch[100];
boolquit=false;
A:
ShowMenu1();
&
x);
if(x=='
1'
)head=CreatListR1();
elseif(x=='
2'
)head=CreatListR2();
elsegotoA;
while(!
quit)
ShowMenu2();
y);
switch(y)
case'
0'
:
quit=true;
break;
case'
请输入要删除的字符串:
DeleteList(head,ch);
Insert(head);
default:
break;
//================主菜单=================
voidShowMenu1()
\n=====================================================\n\n"
1.利用尾插法建立单链表\n"
2.利用头插法建立单链表\n"
\n======================================================\n"
请选择:
voidShowMenu2()
1.删除结点\n"
2.插入结点\n"
0.退出\n"
//==========用尾插法建立带头结点的单链表===========
charch[100];
Input#toend!
\n"
PleaseinputNode_data:
}
\n恭喜,利用尾插法建立单链表成功!
所建单链表如下:
//==========用头插入法建立带头结点的单链表===========
LinkListCreatListR2(void)
//生成头结点
s=(ListNode*)malloc(sizeof(ListNode));
s->
\n恭喜,利用头插法建立单链表成功!
//===========打印链表============
if(!
p)printf("
链表为空!
else
{
%s"
p->
}
while(p&
=0)//直到p为NULL或p->
voidDeleteList(LinkListhead,charkey[100])
Positionerror!
//释放结点
删除字符串%s后新链表为:
key);
//=========申请新的内存空间,插入新结点========
voidInsert(LinkListhead)
ListNode*s,*p;
intn;
请输入要插入的字符串:
s=(LinkList)malloc(sizeof(ListNode));
s->
p=(LinkList)malloc(sizeof(ListNode));
p->
s->
请输入要插入的位置:
%d"
n);
for(p=head;
n>
0;
p=p->
next,n--);
next=p->
在第%d个位置后插入字符串%s后新链表为:
n+1,s);