数据结构实验3知识分享.docx

上传人:b****8 文档编号:11151352 上传时间:2023-02-25 格式:DOCX 页数:26 大小:165.50KB
下载 相关 举报
数据结构实验3知识分享.docx_第1页
第1页 / 共26页
数据结构实验3知识分享.docx_第2页
第2页 / 共26页
数据结构实验3知识分享.docx_第3页
第3页 / 共26页
数据结构实验3知识分享.docx_第4页
第4页 / 共26页
数据结构实验3知识分享.docx_第5页
第5页 / 共26页
点击查看更多>>
下载资源
资源描述

数据结构实验3知识分享.docx

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

数据结构实验3知识分享.docx

数据结构实验3知识分享

 

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

{

i

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

当前位置:首页 > 外语学习 > 日语学习

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

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