数据结构实验3.docx
- 文档编号:25014238
- 上传时间:2023-06-03
- 格式:DOCX
- 页数:26
- 大小:165.56KB
数据结构实验3.docx
《数据结构实验3.docx》由会员分享,可在线阅读,更多相关《数据结构实验3.docx(26页珍藏版)》请在冰豆网上搜索。
数据结构实验3
《数据结构与算法》实验报告
实验序号:
3 实验项目名称:
链式表的操作
学 号
1507112104
姓 名
陈忠表
专业、班
15商智
实验地点
指导教师
林开标
实验时间
16.11.09
一、实验目的及要求
1.通过实验理解单链表的逻辑结构;
2.通过实验掌握单链表的基本操作和具体的函数实现。
二、实验设备(环境)及要求
微型计算机;
windows操作系统;
MicrosoftVisualStudio6.0集成开发环境。
三、实验内容与步骤
链式表表示和实现线性表的如下:
#include"stdio.h"
#include"stdlib.h"
typedefstructnode//定义结点
{
intdata;//结点的数据域为整型
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’){
printf("PleaseinputDelete_data:
");
scanf("%d",num);//输入要删除的字符串
DeleteList(head,num);
printlist(head);
}
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
五、分析与讨论
感觉实验3比之前的实验一、二难度更大,只能浏览同学的,有疑问便问同学,这样勉强理解。
六、教师评语
签名:
日期:
成绩
附源程序清单:
一.
#include"stdio.h"
#include"stdlib.h"
typedefstructnode//定义结点
{
intdata;//结点的数据域为整型
structnode*next;//结点的指针域
}ListNode;
typedefListNode*LinkList;//自定义LinkList单链表类型
LinkListCreatListR1();//函数,用尾插入法建立带头结点的单链表
voidprintlist(LinkListhead);//函数,打印链表中的所有值
ListNode*LocateNode(LinkListhead,intkey);//函数,按值查找结点
voidDeleteList(LinkListhead,intkey);//函数,删除指定值的结点
voidDeleteAll(LinkListhead);
voidmain()
{
intnum;
charch;
LinkListhead;
head=CreatListR1();
printf("List:
\n");
printlist(head);
printf("Deletenode(y/n):
");//输入"y"或"n"去选择是否删除结点
getchar();
scanf("%c",&ch);
if(ch=='y'||ch=='Y'){
printf("PleaseinputDelete_data:
");
scanf("%d",&num);//输入要删除的数
DeleteList(head,num);//删除
printlist(head);//打印
}
DeleteAll(head);//删除所有结点,释放内存
}
//==========用尾插入法建立带头结点的单链表===========
LinkListCreatListR1(void)
{
intn,i,count;
LinkListhead=(LinkList)malloc(sizeof(ListNode));
ListNode*s,*r;//s用来指向新生成的节点。
r始终指向L的终端节点。
r=head;
r->next=NULL;
printf("请输入链表节点数:
");
scanf("%d",&n);
printf("输入节点值:
");
for(i=0;i s=(LinkList)malloc(sizeof(ListNode));//s指向新申请的节点 scanf("%d",&count); s->data=count;//用新节点的数据域来接受i r->next=s;//用r来接纳新节点 r=s;//r指向终端节点 } r->next=NULL; returnhead;//返回头指针returnhead;//返回头指针 } voidprintlist(LinkListhead) { ListNode*p=head->next;//从开始结点打印 while(p){ printf("%d,",p->data); p=p->next; } printf("\n"); } //==========按值查找结点,找到则返回该结点的位置,否则返回NULL========== ListNode*LocateNode(LinkListhead,intkey) { ListNode*p=head->next;//从开始结点比较 while(p&&p->data! =key)//直到p为NULL或p->data为key止 p=p->next;//扫描下一个结点 returnp;//若p=NULL则查找失败,否则p指向找到的值为key的结点 } //==========删除带头结点的单链表中的指定结点======= voidDeleteList(LinkListhead,intkey) { 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); } 二. (1) #include"stdio.h" #include"stdlib.h" typedefstructnode//定义结点 { intdata;//结点的数据域为整型 structnode*next;//结点的指针域 }ListNode; typedefListNode*LinkList;//自定义LinkList单链表类型 LinkListCreatListR1();//函数,用尾插入法建立带头结点的单链表 voidprintlist(LinkListhead); ListNode*LocateNode(LinkListhead,intkey);//函数,按值查找前结点 voidDeleteList(LinkListhead,intkey);//函数,删除指定值的结点 voidDeleteAll(LinkListhead); voidmain() { intnum; charch; LinkListhead; head=CreatListR1(); printf("List: \n"); printlist(head); printf("是否删除链表中值为x的结点的直接前趋结点(y/n): ");//输入"y"或"n"去选择是否删除结点 getchar(); scanf("%c",&ch); if(ch=='y'||ch=='Y'){ printf("PleaseinputDelete_data: "); scanf("%d",&num);//输入要删除的字符串 DeleteList(head,num); printlist(head); } DeleteAll(head);//删除所有结点,释放内存 } //==========用尾插入法建立带头结点的单链表=========== LinkListCreatListR1(void) { intn,i,count; LinkListhead=(LinkList)malloc(sizeof(ListNode)); ListNode*s,*r;//s用来指向新生成的节点。 r始终指向L的终端节点。 r=head; r->next=NULL; printf("请输入链表节点数: "); scanf("%d",&n); printf("输入节点值: "); for(i=0;i s=(LinkList)malloc(sizeof(ListNode));//s指向新申请的节点 scanf("%d",&count); s->data=count;//用新节点的数据域来接受i r->next=s;//用r来接纳新节点 r=s;//r指向终端节点 } r->next=NULL; returnhead;//返回头指针returnhead;//返回头指针 } voidprintlist(LinkListhead) { ListNode*p=head->next;//从开始结点打印 while(p){ printf("%d,",p->data); p=p->next; } printf("\n"); } //==========//按值查找结点,找到返回该结点的直接前驱结点位置,否则返回NULL========== ListNode*LocateNode(LinkListhead,intkey) { ListNode*p=head->next; ListNode*x=head->next;//从开始结点比较 while(p&&p->data! =key)//直到p为NULL或p->data为key止 { x=p;//x为P的前一个节点; p=p->next; }//扫描下一个结点 if(p->data! =key) { x=NULL; } returnx;//若p=NULL则查找失败,否则p指向找到的值为key的结点 } //==========删除带头结点的单链表中的指定结点======= voidDeleteList(LinkListhead,intkey) { 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"stdlib.h" typedefstructnode//定义结点 { intdata;//结点的数据域为整型 structnode*next;//结点的指针域 }ListNode; typedefListNode*LinkList;//自定义LinkList单链表类型 LinkListCreatListR1();//函数,用尾插入法建立带头结点的单链表 voidprintlist(LinkListhead); voidDeleteAll(LinkListhead); voidmain() { intnum; charch; LinkListhead; head=CreatListR1(); printf("List: \n"); printlist(head); DeleteAll(head);//删除所有结点,释放内存 } //==========用尾插入法建立带头结点的单链表=========== LinkListCreatListR1(void) { intn,i,count,change,j; LinkListhead=(LinkList)malloc(sizeof(ListNode)); ListNode*s,*r,*q;//s用来指向新生成的节点。 r始终指向L的终端节点。 r=head; q=head; r->next=NULL; printf("请输入链表节点数: "); scanf("%d",&n); printf("输入节点值: "); for(i=0;i s=(LinkList)malloc(sizeof(ListNode));//s指向新申请的节点 scanf("%d",&count); s->data=count;//用新节点的数据域来接受i r->next=s;//用r来接纳新节点 r=s;//r指向终端节点 } r->next=NULL; //排序; for(i=n;i>0;i--) { q=head->next; for(j=0;j { if((q->data)>(q->next->data)) { change=q->data; q->data=q->next->data; q->next->data=change; q=q->next; } else { q=q->next; } } } returnhead;//返回头指针returnhead;//返回头指针 } voidprintlist(LinkListhead) { ListNode*p=head->next;//从开始结点打印 while(p){ printf("%d,",p->data); p=p->next; } printf("\n"); } //==========删除所有结点,释放空间=========== voidDeleteAll(LinkListhead) { ListNode*p=head,*r; while(p->next){ r=p->next; free(p); p=r; } free(p); } (3) #include"stdio.h" #include"stdlib.h" typedefstructnode//定义结点 { intdata;//结点的数据域为整型 structnode*next;//结点的指针域 }ListNode; typedefListNode*LinkList;//自定义LinkList单链表类型 LinkListCreatListR1();//函数,用尾插入法建立带头结点的单链表 voidprintlist(LinkListhead); voidDeleteSameNode(LinkListhead); voidDeleteAll(LinkListhead); voidmain() { intnum; charch; LinkListhead; head=CreatListR1(); printf("List: \n"); printlist(head); DeleteSameNode(head); printlist(head); DeleteAll(head);//删除所有结点,释放内存 } //==========用尾插入法建立带头结点的单链表=========== LinkListCreatListR1(void) { intn,i,count,change,j; LinkListhead=(LinkList)malloc(sizeof(ListNode)); ListNode*s,*r,*q;//s用来指向新生成的节点。 r始终指向L的终端节点。 r=head; q=head; r->next=NULL; printf("请输入链表节点数: "); scanf("%d",&n); printf("输入节点值: "); for(i=0;i s=(LinkList)malloc(sizeof(ListNode));//s指向新申请的节点 scanf("%d",&count); s->data=count;//用新节点的数据域来接受i r->next=s;//用r来接纳新节点 r=s;//r指向终端节点 } r->next=NULL; //排序; for(i=n;i>0;i--) { q=head->next; for(j=0;j { if((q->data)>(q->next->data)) { change=q->data; q->data=q->next->data; q->next->data=change; q=q->next; } else { q=q->next; } } } returnhead;//返回头指针returnhead;//返回头指针 } voidprintlist(LinkListhead) { ListNode*p=head->next;//从开始结点打印 while(p){ printf("%d,",p->data); p=p->next; } printf("\n"); } //==========删除多余节点========== voidDeleteSameNode(LinkListhead) { intn=2; ListNode*p,*q,*t,*s; p=head; p=p->next;//p第一个 while(p->next) { if(p->data==p->next->data) { if(p->next->next=
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 实验