数据结构实验3.docx

上传人:b****3 文档编号:5084625 上传时间:2022-12-13 格式:DOCX 页数:23 大小:165.54KB
下载 相关 举报
数据结构实验3.docx_第1页
第1页 / 共23页
数据结构实验3.docx_第2页
第2页 / 共23页
数据结构实验3.docx_第3页
第3页 / 共23页
数据结构实验3.docx_第4页
第4页 / 共23页
数据结构实验3.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

数据结构实验3.docx

《数据结构实验3.docx》由会员分享,可在线阅读,更多相关《数据结构实验3.docx(23页珍藏版)》请在冰豆网上搜索。

数据结构实验3.docx

数据结构实验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==NULL)

{

p>next=NULL;

}

else

{

p>next=p>next>next;

p=p>next;

}

}

else

{

p=p>next;

}

}

}

//========

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1