数据结构实验3+学号+姓名Word文件下载.docx
- 文档编号:8600062
- 上传时间:2023-05-12
- 格式:DOCX
- 页数:23
- 大小:165.48KB
数据结构实验3+学号+姓名Word文件下载.docx
《数据结构实验3+学号+姓名Word文件下载.docx》由会员分享,可在线阅读,更多相关《数据结构实验3+学号+姓名Word文件下载.docx(23页珍藏版)》请在冰点文库上搜索。
//结点的数据域为整型
structnode*next;
//结点的指针域
}ListNode;
typedefListNode*LinkList;
//自定义LinkList单链表类型
LinkListCreatListR1();
//函数,用尾插入法建立带头结点的单链表
ListNode*LocateNode(LinkListhead,intkey);
//函数,按值查找结点
voidDeleteList(LinkListhead,intkey);
//函数,删除指定值的结点
voidprintlist(LinkListhead);
//函数,打印链表中的所有值
voidDeleteAll(LinkListhead);
//函数,删除所有结点,释放内存
//==========主函数==============
voidmain()
{
intnum;
charch;
LinkListhead;
head=CreatListR1();
//用尾插入法建立单链表,返回头指针
printlist(head);
//遍历链表输出其值
printf("
Deletenode(y/n):
"
);
//输入"
y"
或"
n"
去选择是否删除结点
scanf("
%c"
&
ch);
if(ch==’y’)||ch==’Y’){
PleaseinputDelete_data:
%d"
num);
//输入要删除的字符串
DeleteList(head,num);
}
DeleteAll(head);
//删除所有结点,释放内存
}
//==========用尾插入法建立带头结点的单链表===========
LinkListCreatListR1(void)
……
returnhead;
//返回头指针
//==========按值查找结点,找到则返回该结点的位置,否则返回NULL==========
ListNode*LocateNode(LinkListhead,intkey)
returnp;
//若p=NULL则查找失败,否则p指向找到的值为key的结点
//==========删除带头结点的单链表中的指定结点=======
voidDeleteList(LinkListhead,intkey)
//按key值查找结点的
//若没有找到结点,退出
//若找到,则从单链表中删除该结点,并释放结点
……
//===========打印链表,输出所有结点的值=======
voidprintlist(LinkListhead)
//==========删除所有结点,释放空间===========
voidDeleteAll(LinkListhead)
}
1、实现并调试单链表的的相关算法;
2、改写以上程序,实现功能如下:
(1)编写一个删除链表中值为x的结点的直接前趋结点的算法,若有多个值为x的结点,则删除第一个x的直接前趋结点。
(2)改写CreatListR1函数,使得链表创建时为非递减有序的单链表。
(3)在算法
(2)生成的非递减有序的单链表中,编写一个算法,删除单链表中值相同的多余结点。
(4)写一个对单循环链表进行逆序输出(打印每个结点的值)的算法。
四、实验结果与数据处理
一.实验结果如图1所示:
图1
二.
(1)实验结果如图2所示:
图2
(2)实验结果如图3所示:
图3
(3)实验结果如图4所示:
图4
(4)实验结果如图5所示:
图5
五、分析与讨论
六、教师评语
签名:
日期:
成绩
附源程序清单:
一.
//函数,打印链表中的所有值
//函数,删除指定值的结点
charch;
List:
\n"
getchar();
if(ch=='
y'
||ch=='
Y'
){
num);
//输入要删除的数
//删除
//打印
LinkListCreatListR1(void)
intn,i,count;
LinkListhead=(LinkList)malloc(sizeof(ListNode));
ListNode*s,*r;
//s用来指向新生成的节点。
r始终指向L的终端节点。
r=head;
r->
next=NULL;
请输入链表节点数:
n);
输入节点值:
for(i=0;
i<
n;
i++){
s=(LinkList)malloc(sizeof(ListNode));
//s指向新申请的节点
count);
s->
data=count;
//用新节点的数据域来接受i
next=s;
//用r来接纳新节点
r=s;
//r指向终端节点
}
next=NULL;
//返回头指针returnhead;
ListNode*p=head->
next;
//从开始结点打印
while(p){
%d,"
p->
data);
p=p->
//从开始结点比较
while(p&
&
p->
data!
=key)//直到p为NULL或p->
data为key止
//扫描下一个结点
//==========删除带头结点的单链表中的指定结点=======
ListNode*p,*r,*q=head;
p=LocateNode(head,key);
if(p==NULL){//若没有找到结点,退出
positionerror"
exit(0);
while(q->
next!
=p)//p为要删除的结点,q为p的前结点
q=q->
r=q->
q->
next=r->
free(r);
//释放结点
ListNode*p=head,*r;
while(p->
next){
r=p->
free(p);
p=r;
二.
(1)
//函数,按值查找前结点
是否删除链表中值为x的结点的直接前趋结点(y/n):
//==========//按值查找结点,找到返回该结点的直接前驱结点位置,否则返回NULL==========
ListNode*x=head->
//从开始结点比较
=key)//直到p为NULL或p->
x=p;
//x为P的前一个节点;
}//扫描下一个结点
if(p->
=key)
x=NULL;
returnx;
r=q->
free(p);
(2)
intn,i,count,change,j;
ListNode*s,*r,*q;
q=head;
//排序;
for(i=n;
i>
0;
i--)
q=head->
for(j=0;
j<
n-1;
j++)
if((q->
data)>
(q->
next->
data))
{
change=q->
data;
q->
data=q->
data=change;
q=q->
}
else
(3)
voidDeleteSameNode(LinkListhead);
DeleteSameNode(head);
ListNode*s,*r,*q;
//==========删除多余节点==========
voidDeleteSameNode(LinkListhead)
intn=2;
ListNode*p,*q,*t,*s;
p=head;
p=p->
//p第一个
next)
{
if(p->
data==p->
data)
if(p->
next==NULL)
p->
next=p->
next
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 实验 学号 姓名
![提示](https://static.bingdoc.com/images/bang_tan.gif)