数据结构实验399XXXWord格式.docx
- 文档编号:16602205
- 上传时间:2022-11-24
- 格式:DOCX
- 页数:34
- 大小:69.97KB
数据结构实验399XXXWord格式.docx
《数据结构实验399XXXWord格式.docx》由会员分享,可在线阅读,更多相关《数据结构实验399XXXWord格式.docx(34页珍藏版)》请在冰豆网上搜索。
stdio.h"
string.h"
stdlib.h"
ctype.h"
typedefstructnode//定义结点
{
chardata[10];
//结点的数据域为字符串
structnode*next;
//结点的指针域
}ListNode;
typedefListNode*LinkList;
//自定义LinkList单链表类型
LinkListCreatListR1();
//函数,用尾插入法建立带头结点的单链表
ListNode*LocateNode(LinkListhead,char*key);
//函数,按值查找结点
voidDeleteList(LinkListhead,char*key);
//函数,删除指定值的结点
voidprintlist(LinkListhead);
//函数,打印链表中的所有值
voidDeleteAll(LinkListhead);
//函数,删除所有结点,释放内存
//==========主函数==============
voidmain()
{
char*ch,*num;
num=newchar;
ch=newchar[10];
LinkListhead;
head=CreatListR1();
//用尾插入法建立单链表,返回头指针
printlist(head);
//遍历链表输出其值
printf("
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);
}
DeleteAll(head);
//删除所有结点,释放内存
}
//==========用尾插入法建立带头结点的单链表===========
LinkListCreatListR1(void)
char*ch;
LinkListhead=(LinkList)malloc(sizeof(ListNode));
//生成头结点
ListNode*s,*r,*pp;
r=head;
r->
next=NULL;
Input#toend"
#"
代表输入结束
PleaseinputNode_data:
//输入各结点的字符串
while(strcmp(ch,"
)!
=0){
s=(ListNode*)malloc(sizeof(ListNode));
strcpy(s->
data,ch);
r->
next=s;
r=s;
scanf("
returnhead;
//返回头指针
//==========按值查找结点,找到则返回该结点的位置,否则返回NULL==========
ListNode*LocateNode(LinkListhead,char*key)
ListNode*p=head->
next;
//从开始结点比较
while(strcmp(p->
data,key)!
=0&
&
p)//直到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);
//释放结点
//===========打印链表=======
voidprintlist(LinkListhead)
//从开始结点打印
while(p){
%s,"
p->
data);
\n"
//==========删除所有结点,释放空间===========
voidDeleteAll(LinkListhead)
ListNode*p=head,*r;
while(p->
next){
r=p->
free(p);
p=r;
free(p);
}
1、调试实现单链表的的相关算法;
2、改写以上程序,实现功能如下:
1)编写一个删除链表中值为x的结点的直接前趋结点的算法,若有多个值为x的结点,则删除第一个x的直接前趋结点。
2)写一个对单循环链表进行逆序输出(打印每个结点的值)的算法。
3)改写CreatListR1函数,使得链表创建时为非递减有序的单链表。
4)在算法3)生成的非递减有序的单链表中,编写一个算法,删除单链表中值相同的多余结点。
四、实验结果与数据处理
详细记录程序在调试过程中出现的问题及解决方法。
记录程序执行的结果(贴图)。
五、分析与讨论
对上机实践结果进行分析,上机的心得体会。
六、教师评语
签名:
日期:
成绩
附源程序清单:
1、
char*L;
}ListNode;
LinkListCreatListR();
//函数,用头插入法建立带头结点的单链表
LinkListLocateNode(LinkListhead,char*key);
LinkListLocateBreforeNode(LinkListhead,char*key);
//函数,查找指定数值的前驱结点
voidDeleteBreforeNode(LinkListhead,char*key);
//函数,删除指定数值的前驱结点
LinkListpm;
)==0)
输入要查找的数值"
pm=LocateNode(head,ch);
%s\n"
pm->
输入要删除的数值的前驱结点"
DeleteBreforeNode(head,ch);
对单循环链表进行逆序输出\n"
head=CreatListR();
//用头插入法建立单链表,返回头指针
//DeleteAll(head);
//==========查找的指定数值的前驱结点=======
LinkListLocateBreforeNode(LinkListhead,char*key)
ListNode*t;
//p的上一个节点指针
while(p&
strcmp(p->
=0)//直到p为NULL或p->
t=p;
//记录上一个节点的指针
p=p->
}
returnt;
//==========删除的指定数值的前驱结点=======
voidDeleteBreforeNode(LinkListhead,char*key)
ListNode*pp,*r,*q=head;
pp=LocateBreforeNode(head,key);
if(pp==NULL)
{//若没有找到结点,退出
=pp)//p为要删除的结点,q为p的前结点
ListNode*s,*r;
=0)
{
//printf("
//==========用头插入法建立带头结点的单链表===========
LinkListCreatListR(void)
PleaseinputcricleNode_data:
//输入各结点的字符串
do//while(strcmp(s->
data,"
=0)
s=(LinkList)malloc(sizeof(ListNode));
s->
s->
}while(strcmp(s->
=0);
next->
LinkListLocateNode(LinkListhead,char*key)
if(p==NULL)
while(p)
printf("
next)
r=p->
p=r;
1).
LinkListhead=(LinkList)malloc(size
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 实验 399 XXX