数据结构课程实验报告.docx
- 文档编号:3077626
- 上传时间:2022-11-17
- 格式:DOCX
- 页数:39
- 大小:704.66KB
数据结构课程实验报告.docx
《数据结构课程实验报告.docx》由会员分享,可在线阅读,更多相关《数据结构课程实验报告.docx(39页珍藏版)》请在冰豆网上搜索。
数据结构课程实验报告
课程实验报告
课程名称:
数据结构
专业班级:
信息平安1302
学号:
姓名:
指导教师:
报告日期:
运算机科学与技术学院
1课程实验概述
实验
(一)基于顺序存储结构,实现线性表的大体的,常见的运算:
(1)提供一个实现功能的演示系统;
(2)具体物理结构和数据元素类型自行选定;
(3)线性表数据能够利用磁盘文件永久保留;
实验
(二)基于链式存储结构,实现线性表的大体的,常见的运算:
(1)提供一个实现功能的演示系统;
(2)具体物理结构和数据元素类型自行选定;
(3)线性表数据能够利用磁盘文件永久保留
实验(三)基于二叉链表,实现二叉树的大体的、常见的运算:
(1)提供一个实现功能的演示系统;
(2)具体物理结构和数据元素类型自行选定;
(3)可采纳递归和非递归算法实现。
2实验一基于顺序结构的线性表实现
问题描述
(1)提供一个实现功能的演示系统;
(2)具体物理结构和数据元素类型自行选定;
(3)线性表数据能够利用磁盘文件永久保留;
系统设计
抽象数据类型顺序表概念:
数据结构概念
typedefintElemType;//假设数据元素为整型
typedefstruct{
ElemType*elem;
intlength;
intlistsize;
}SqList;
系统实现
成立空表
statusIntiaList(SqList&L){
=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if==NULL)
exit(OVERFLOW);
else
{
=0;
=LIST_INIT_SIZE;
returnOK;
}
}
演示如下:
销毁顺序表
statusDestroyList(SqList&L){
if==NULL)
returnERROR;
else
{
free;
=NULL;
returnOK;
}
}
演示如下:
清空顺序表
statusClearList(SqList&L){
if==NULL)
return(ERROR);
inti;
ElemType*p_elem=;
for(i=0;i<;i++)
{
*=NULL;
++;
}
=p_elem;
returnOK;
}
演示如下:
判定顺序表是不是为空表
statusListEmpty(SqListL){
inti;
ElemType*p_elem=;
for(i=0;i<;i++)
{
if(*!
=0)
{
=p_elem;
returnFALSE;
}
++;
}
returnTRUE;
}
演示如下:
输出表长
intListLength(SqListL){
return;
}
演示如下:
输出表中某个值
statusGetElem(SqListL,inti,ElemType&e){
intj,element;
ElemType*p_elem=;
if(i<1||i>
returnERROR;
for(j=1;j<=i;j++)
++;
element=*;
=p_elem;
e=element;
returnOK;
}
演示如下:
确信某个值在表中的位置
statusLocatElem(SqListL,int&i,ElemTypeelement){
ElemType*p_elem=;
for(i=1;i<;i++)
{
if(*==element)
{
=p_elem;
returnOK;
}
else
++;
}
return0;
}
演示如下:
返回某个值的前驱值
statusPriorElem(SqListL,ElemTypecur_e,ElemType&pre_e){
ElemType*p_elem=;
inti,j;
LocatElem(L,i,cur_e);
if(i<=1||i>
returnFALSE;
for(j=1;j<=;j++)
{
if(j==(i-1))
{
pre_e=*;
=p_elem;
returnOK;
}
else
++;
}
}
演示如下:
返回某个值的后驱值
statusNextElem(SqListL,ElemTypecur_e,ElemType&next_e){
ElemType*p_elem=;
inti,j=1;
LocatElem(L,i,cur_e);
if(i<1||i>=
return0;
for(j=1;j<=;j++)
{
if(j==(i+1))
{
next_e=*;
=p_elem;
returnOK;
}
else
++;
}
}
演示如下:
在顺序表中插入一个值
statusListInsert(SqList&L,inti,ElemTypee){
int*q=&[i-1]);
ElemType*newbase,*p;
if(i<1||i>+1))
returnERROR;
if>=
{newbase=(ElemType*)realloc,+LISTINCREMENT*sizeof(ElemType));
if(newbase==NULL)
exit(OVERFLOW);
=newbase;
+=LISTINCREMENT;
}
for(p=&[]);p>=q;--p)
*(p+1)=*p;
*q=e;
++;
returnOK;
}
演示如下:
在顺序表中删除某个值
statusListDelete(SqList&L,inti,ElemType&e){
if(i<1||(i>)
returnERROR;
ElemType*p,*q;
p=&[i]);
e=[i-1];
q=+;
for(;p<=q;++p)
*(p-1)=*p;
;
returnOK;
}
演示如下:
遍历整个顺序表并输出
statusListTrabverse(SqListL,void(*visit)(ElemTypee)){
inti;
if(!
return(0);
printf("\n-------------allelementsoflieartable----------------\n");
for(i=0;i<;i++)visit[i]);
return
(1);
}
演示如下:
贮存顺序表的数据在磁盘中
statussave(SqListL)
{
intn=0;
FILE*fout;
fout=fopen("","w+");
while(n<
{
fprintf(fout,"%d\n",[n]);
n++;
}
fclose(fout);
returnOK;
}
演示如下:
效率分析
顺序线性表的插入:
在线性表L中的第i个元素之前插入新结点,其时刻要紧花费在表中结点的移动操作上,因此,可用结点的移动来估量算法的时刻复杂度。
设在线性表L中的第i个元素之前插入结点的概率为Pi,不失一样性,设各个位置插入是等概率,那么Pi=1/(n+1),而插入时移动结点的次数为n-i+1。
总的平均移动次数:
Einsert=∑pi*(n-i+1)(1≦i≦n)∴Einsert=n/2。
即在顺序表上做插入运算,平均要移动表上一半结点。
当表长n较大时,算法的效率相当低。
因此算法的平均时刻复杂度为O(n)。
顺序线性表的删除:
删除线性表L中的第i个元素,其时刻要紧花费在表中结点的移动操作上,因此,可用结点的移动来估量算法的时刻复杂度。
设在线性表L中删除第i个元素的概率为Pi,不失一样性,设删除各个位置是等概率,那么Pi=1/n,而删除时移动结点的次数为n-i。
那么总的平均移动次数:
Edelete=∑pi*(n-i)(1≦i≦n)∴Edelete=(n-1)/2。
即在顺序表上做删除运算,平均要移动表上一半结点。
当表长n较大时,算法的效率相当低。
因此算法的平均时刻复杂度为O(n)。
顺序线性表的查找定位删除:
时刻要紧花费在数据元素的比较和移动操作上。
第一,在线性表L中查找值为x的结点是不是存在;第二,假设值为x的结点存在,且在线性表L中的位置为i,那么在线性表L中删除第i个元素。
设在线性表L删除数据元素概率为Pi,不失一样性,设各个位置是等概率,那么Pi=1/n。
比较的平均次数:
Ecompare=∑pi*i(1≦i≦n)∴Ecompare=(n+1)/2。
删除时平均移动次数:
Edelete=∑pi*(n-i)(1≦i≦n)∴Edelete=(n-1)/2。
平均时刻复杂度:
Ecompare+Edelete=n,即为O(n)
顺序存储的线性表的特点:
优势:
表中任一结点的存取很方便,也能进行插入和删除操作。
缺点:
(1)
插入和删除不方便。
为维持持续寄存,操作中需要移动大量元素。
(2)会造成空间的浪费和不易扩充。
数组大小固定,关于处置长度转变较大的线性表时,分派数组大小不够,会造成溢出;分派大小太大,会造成空间浪费。
3实验二基于链式结构的线性表实现
问题描述
(1)提供一个实现功能的演示系统;
(2)具体物理结构和数据元素类型自行选定;
(3)线性表数据能够利用磁盘文件永久保留
系统设计
抽象数据类型链表概念:
数据结构大体概念:
typedefintElemType;//数据元素类型概念
typedefstructLNode{
ElemTypedata;
structLNode*next;
}LNode,*Link;
typedefstruct{
Linkhead,tail;
intlen;
}LinkList;
系统实现
制造一个空表
statusCreatList(LinkList&L,intn)
{
Linkp;
inti;
=(Link)malloc(sizeof(LNode));
if==NULL)
exit(-1);
=;
for(i=0;i { p=(Link)malloc(sizeof(LNode)); printf("\ninputn[%d]=",i+1); scanf("%d",&(p->data)); ->next=p; =p; p->next=NULL; } =n; returnOK; } 演示如下: 销毁链表 statusDestroyList(LinkList&L) { if==NULL) returnERROR; else { free; =NULL; =0; returnOK; } } 演示如下: 清空链
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程 实验 报告