数据结构实验3+学号+姓名.docx
《数据结构实验3+学号+姓名.docx》由会员分享,可在线阅读,更多相关《数据结构实验3+学号+姓名.docx(23页珍藏版)》请在冰豆网上搜索。
数据结构实验3+学号+姓名
《数据结构与算法》实验报告
实验序号:
3 实验项目名称:
链式表的操作
学 号
姓 名
专业、班
实验地点
指导教师
实验时间
一、实验目的及要求
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
五、分析与讨论
六、教师评语
签名:
日期:
成绩
附源程序清单:
一.
#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