数据结构单链表实验报告全集文档Word文档下载推荐.docx
- 文档编号:22686415
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:36
- 大小:494.49KB
数据结构单链表实验报告全集文档Word文档下载推荐.docx
《数据结构单链表实验报告全集文档Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《数据结构单链表实验报告全集文档Word文档下载推荐.docx(36页珍藏版)》请在冰豆网上搜索。
4.详细设计
voidinit_linklist(LinkList*l)/*对单链表进行初始化*/{
*l=(LinkList)malloc(sizeof(Node));
/*申请结点空间*/
(*l)->
next=NULL;
/*置为空表*/
}
voidCreateFromHead(LinkListL)
{
Node*s;
charc;
intflag=1;
while(flag)/*flag初值为1,当输入"
$"
时,置flag为0,建表结束*/
{
c=getchar();
if(c!
='
$'
)
{
s=(Node*)malloc(sizeof(Node));
/*建立新结点s*/
s->
data=c;
next=L->
next;
/*将s结点插入表头*/
L->
next=s;
}
else
flag=0;
}
voidCreateFromTail(LinkListL)
Node*r,*s;
charc;
intflag=1;
/*设置一个标志,初值为1,当输入"
时,flag为0,建表结束*/
r=L;
/*r指针动态指向链表的当前表尾,以便于做尾插入,其初值指向头结点*/
while(flag)/*循环输入表中元素值,将建立新结点s插入表尾*/
r->
r=s;
/*将最后一个结点的next链域置为空,表示链表的结束*/
}
}
Node*Get(LinkListL,inti)
/*在带头结点的单链表L中查找第i个结点,若找到(1≤i≤n),则返回该结点的存储位置;
否则返回NULL*/
intj;
Node*p;
p=L;
j=0;
/*从头结点开始扫描*/
while((p->
next!
=NULL)&
&
(j<
i))
{
p=p->
/*扫描下一结点*/
j++;
/*已扫描结点计数器*/
if(i==j)
returnp;
/*找到了第i个结点*/
else
returnNULL;
/*找不到,i≤0或i>
n*/
Node*Locate(LinkListL,ElemTypekey)
/*在带头结点的单链表L中查找其结点值等于key的结点,若找到则返回该结点的位置p,否则返回NULL*/
p=L->
/*从表中第一个结点开始*/
while(p!
=NULL)
if(p->
data!
=key)
p=p->
else
break;
/*找到结点值=key时退出循环*/
returnp;
intInsList(LinkListL,inti,ElemTypee)
/*在带头结点的单链表L中第i个位置插入值为e的新结点s*/
Node*pre,*s;
intk;
pre=L;
k=0;
/*从"
头"
开始,查找第i-1个结点*/
while(pre!
=NULL&
k<
i-1)/*表未查完且未查到第i-1个时重复,找到pre指向第i-1个*/
pre=pre->
k=k+1;
}/*查找第i-1结点*/
if(!
pre)/*如当前位置pre为空表已找完还未数到第i个,说明插入位置不合理*/
printf("
插入位置不合理!
"
);
returnERROR;
s=(Node*)malloc(sizeof(Node));
/*申请一个新的结点S*/
s->
data=e;
/*值e置入s的数据域*/
next=pre->
/*修改指针,完成插入操作*/
pre->
returnOK;
intDelList(LinkListL,inti,ElemType*e)
/*在带头结点的单链表L中删除第i个元素,并将删除的元素保存到变量*e中*/
Node*pre,*r;
while(pre->
=NULL&
k<
i-1)/*寻找被删除结点i的前驱结点i-1使p指向它*/
}/*查找第i-1个结点*/
(pre->
next))/*即while循环是因为p->
next=NULL或i<
1而跳出的,而是因为没有找到合法的前驱位置,说明删除位置i不合法。
*/
删除结点的位置i不合理!
r=pre->
next->
/*修改指针,删除结点r*/
*e=r->
data;
free(r);
/*释放被删除的结点所占的内存空间*/
printf("
成功删除结点!
intListLength(LinkListL)
/*求带头结点的单链表L的长度*/
/*用来存放单链表的长度*/
while(p!
returnj;
/*j为求得的单链表长度*/
5.测试数据及结果
实验总结:
在调试的时候发现在头插法的时候出现错误,经过逻辑思考与调试,发现错误所在,并且更改。
数据结构实验报告
号
实验地点
数学楼
指导教师
实验
名称
队列的表示与实现
1、实验目的
了解和掌握队列的数据类型描述及其特点;
完成链队列的初始化、入队、出队、取对头元素、显示操作的实现;
掌握队列的链式存储表示与基本操作算法实现;
掌握队列在实际问题中的应用和基本编程技巧。
2、实验方法
队列的抽象数据类型定义:
ADTQueue{
//数据对象:
D={a[i]|a[i]∈ElemSet,i=1,2,...,n,n>
=0}
//数据关系:
R1={<
a[i-1],a[i]>
|a[i-1],a[i]∈D,i=2,...,n}
//约定其中a[1]端为队列头,a[n]端为队列尾
//基本操作:
InitQueue(&
Q)//操作结果:
构造一个空队列Q。
DestoryQueue(&
Q)//初始条件:
队列Q已存在
//操作结果:
队列Q被销毁,不再存在
ClearQueue(&
将Q清为空队列
QueueEmpty(Q)//初始条件:
//操作结果:
若队列Q为空队列,则返回TRUE,否则FALSE
QueueLength(Q)//初始条件:
返回Q的元素个数,即队列的长度
GetHead(Q,&
e)//初始条件:
Q为非空队列
用e返回Q的队头元素
EnQueue(&
Q,e)//初始条件:
插入元素e为Q的新的队尾元素
DeQueue(&
Q,&
删除Q的队头元素,并用e返回其值
QueueTraverse(Q,visit())//初始条件:
Q已存在且非空
从队头到队尾,依次对Q的每个数据元素调用函数visit()。
一旦visit()失败,则操作失败。
}ADTQueue
与线性表类似,队列有两种存储表示链队列和循环队列。
//-----基本操作的函数原型说明-----
statusINitQueue(LinkQueue&
Q)//构造一个空队列Q
StatusDestoryQueue(LinkQueue&
Q)//销毁队列Q,Q不再存在
StatusClearQueue(LinkQueue&
Q)//将Q清为空队列
StatusQueueEmpty(LinkQueueQ)
//若队列Q为空队列,则返回TRUE,否则返回FALSE
intQueueLength(LinkQueueQ)//返回Q的元素个数,即为队列的长度
StatusGetHead(LinkQueueQ,QElemType&
e)
//若队列不空,则用e返回Q的队头元素,并返回OK;
否则返回ERROR
StatusENQueue(LinkQueue&
Q,QElemTypee)//插入元素e为Q的新的队尾元素
StatusDeQueue(LinkQueue&
Q,QElemType&
//若队列不空,则删除Q的队头元素,用e返回其值,并返回OK;
statusQueueTraverse(linkQueueQ,visit())
//从队头到队尾依次对队列Q中的每个元素调用函数visit()。
一旦visit失败,则操作失败。
链队列:
//单链队列——队列的链式存储结构
typedefstructQNode{
QElemTypedata;
structQNode*next;
}QNode,*QueuePtr;
typedefstruct{
QueuePtrfront;
//队头指针
QueuePtrrear;
//队尾指针
}LinkQueue;
//-----单链队列的基本操作的算法描述------
Q){//构造一个空队列Q
Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));
Q.front)exit(OVERFLOW);
//存储分配失败
Q.front->
next=NULL;
Q){//销毁队列Q,Q不再存在
while(Q.front){
Q.rear=Q.front->
free(Q.front);
Q.front=Q.rear;
Q)
//将Q清为空队列
intQueueLength(LinkQueueQ)
//返回Q的元素个数,即为队列的长度
Q,QElemTypee){//插入元素e为Q的新的队尾元素
p=(QueuePtr)malloc(sizeof(QNode));
p)exit(OVERFLOW);
p->
p->
Q.rear->
next=p;
Q.rear=p;
e){
if(Q.front==Q.rear)returnERROR;
p=Q.front->
e=p->
Q.front->
next=p->
if(Q.rear==p)Q.rear=Q.front;
free(p);
//一旦visit失败,则操作失败。
循环队列:
//循环队列——队列的顺序存储结构
#defineMAXQSIZE100//最大队列长度
QElemType*base;
//初始化的动态分配存储空间
intfront;
//头指针,若队列不空,指向队列头元素
intrear;
//尾指针,若队列不空,指向队列尾元素的下一个位置
}SqQueue;
//-----循环队列的基本操作的算法描述------
StatusInitQueue(SqQueue&
Q){
//构造一个空队列Q
Q.base=(QElemType*)malloc(MAXQSIZE*sizeof(QElemType));
Q.base)exit(OVERFLOW);
//存储分配失败
Q.front=Q.rear=0;
intQueueLength(SqQueueQ){//返回Q的元素个数,即队列的长度
return(Q.rear-Q.front+MAXQSIZE)%MAXQSIZE;
statusEnQueue(SqQueue&
Q,QElemType){//插入元素e为Q的新的队尾元素
if((Q.rear+1)%MAXQSIZE==Q.front)returnERROR;
//队列满
Q.base[Q.rear]=e;
Q.rear=(Q.rear+1)%MAXQSIZE;
StatusDeQueue(Squeue&
//若队列不空,则删除Q的队头元素,用e返回其值,并返回OK;
//否则返回ERROR
e=Q.base[Q.front];
Q.front=(Q.front+1)%MAXQSIZE;
3、事先定义的常量和类型
/***********************C函数库定义****************/
#include<
stdio.h>
//EOFNULL
string.h>
malloc.h>
//malloc();
limits.h>
//ENTMAX
stdlib.h>
math.h>
//floor(),fabs(),abs(),ceil(),
io.h>
//eof()
process.h>
//exit()
iostream.h>
//cout,cin
/******************函数结果状态代码****************/
#defineTRUE1
#defineFALSE0
#defineOK1
#defineERROR0
#defineINFEASIBLE-1
//#defineOVERFLOW-2//因为math.h中已经定义OVERFLOW为3
typedefintQElemType;
//ElemType是变量的类型定义
typedefintStatus;
//Status是函数的类型,其值是函数结果状态代码,如OK,TRUE。
4、实验过程
链队列
#include<
#defineOVERFLOW0
typedefstructQNode
intdata;
typedefstruct
intInitQueue(LinkQueue&
Q.rear=Q.front=(QueuePtr)malloc(sizeof(QNode));
Q.rear)
exit(OVERFLOW);
voidQueueEmpty(LinkQueueQ)
if(Q.front==Q.rear)
printf("
该链队为空:
else
该链队不为空:
voidEnQueue(LinkQueue&
Q,inte)
QueuePtrp;
p)
error"
Q.rear->
next=p;
Q.rear=p;
元素%d入队成功"
e);
intEnnQueue(LinkQueue&
voidDeQueue(LinkQueue&
该链队为空"
if(Q.rear==p)
Q.rear=Q.front;
队首元素删除成功"
voidGetHead(LinkQueue&
队首元素为:
%d"
p->
data);
voidOutQueue(LinkQueue&
=Q.rear->
next)
voidLengthQueue(LinkQueue&
intf=0;
该队列的长度是:
f);
p=Q.front->
while(p!
f++;
voidmain()
system("
cls"
intflag=1,i;
LinkQueueQ;
InitQueue(Q);
************************链队列功能菜单***********************\n"
1:
初始化链队列,2:
判断链队列是否为空,3:
进入队列,4:
取出队首元素\n"
5:
输出该队列的所有元素,6:
输出该队列的长度,7:
结束程序,8:
清屏\n"
while(flag)
\n请输入操作符:
scanf("
&
i);
switch(i)
case1:
inte,n,k;
printf("
请输入队列的长度:
scanf("
n);
请输入队列的元素:
for(e=1;
e<
=n;
e++)
{
scanf("
k);
EnnQueue(Q,k);
}
初始化链队成功"
case2:
QueueEmpty(Q);
case3:
intj;
请输入要进入队列的元素"
j);
EnQu
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 单链表 实验 报告 全集 文档