数据结构实验3.docx
《数据结构实验3.docx》由会员分享,可在线阅读,更多相关《数据结构实验3.docx(23页珍藏版)》请在冰豆网上搜索。
![数据结构实验3.docx](https://file1.bdocx.com/fileroot1/2022-12/12/9ab8770c-2ce5-4229-ad8f-6588452b15d6/9ab8770c-2ce5-4229-ad8f-6588452b15d61.gif)
数据结构实验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;is=(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;is=(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;is=(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;is=(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==NULL)
{
p>next=NULL;
}
else
{
p>next=p>next>next;
p=p>next;
}
}
else
{
p=p>next;
}
}
}
//========