数据结构课程实验报告13.docx
- 文档编号:3055272
- 上传时间:2022-11-17
- 格式:DOCX
- 页数:58
- 大小:33.28KB
数据结构课程实验报告13.docx
《数据结构课程实验报告13.docx》由会员分享,可在线阅读,更多相关《数据结构课程实验报告13.docx(58页珍藏版)》请在冰豆网上搜索。
数据结构课程实验报告13
课程实验报告
课程名称:
数据结构
专业班级:
信安1302
学号:
姓名:
指导教师:
报告日期:
2015/5/14
计算机科学与技术学院
6源程序附录
1课程实验概述
实验
(一)基于顺序存储结构,实现线性表的基本的,常见的运算:
提示:
(1)提供一个实现功能的演示系统;
(2)具体物理结构和数据元素类型自行选定;
(3)线性表数据可以使用磁盘文件永久保存
实验
(二)基于链式存储结构,实现线性表的基本的,常见的运算:
提示:
(1)提供一个实现功能的演示系统;
(2)具体物理结构和数据元素类型自行选定;
(3)线性表数据可以使用磁盘文件永久保存
实验(三)基于二叉链表,实现二叉树的基本的、常见的运算:
提示:
(1)提供一个实现功能的演示系统;
(2)具体物理结构和数据元素类型自行选定;
(3)可采用递归和非递归算法实现。
2实验一基于顺序结构的线性表实现
2.1问题描述
基于顺序存储结构,实现线性表的基本的、常见的运算。
2.2系统设计
该程序共有12个功能:
数据元素类型定义为:
typedefintstatus;
typedefintElemType;
顺序表(顺序结构)的定义为:
typedefstruct{
ElemType*elem;
intlength;
intlistsize;
}SqList;
2.3系统实现
2.3.1IntiaList功能
初始化线性表,传入的是头结点地址。
申请一个大小为LIST_INT_SIZE、类型为Elemtype的线性存储空间,并用头结点中的首结点指针指向该空间首地址。
具体实现如下:
statusIntiaList(SqList&L){
L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!
L.elem)exit(OVERFLOW);
L.length=0;
L.listsize=LIST_INIT_SIZE;
returnOK;
}
测试结果:
2.3.2DestroyList功能
销毁头结点中首结点址针指向的线性存储空间,传入的是头结点地址。
具体实现如下:
statusDestroyList(SqList&L){
free(L.elem);
L.elem=NULL;
L.length=0;
L.listsize=0;
returnOK;
}
测试结果:
2.3.3ClearList功能
与Destroy类似但是又有不同,ClearList并不销毁物理空间,而是修改逻辑关系值:
statusClearList(SqList&L){
L.length=0;
returnOK;
}
测试结果:
2.3.4ListEmpty功能
判空功能,判断表是否为空表。
传入的是头结点值,而非地址,因为不需要对头结点进行修改。
实现如下:
statusListEmpty(SqListL){
if(!
L.length)returnOK;
elsereturnERROR;
}
测试结果:
空表时:
非空表时:
2.3.5ListLength功能
求表长功能,由于创建过程中已经把表长信息包含在头结点中,所以直接调用并显示即可:
intListLength(SqListL){
returnL.length;
}
测试结果:
空表时
2.3.6GetElem功能
获取第i号元素,传入的是头结点值、元素编号i、以及出口表结点地址:
statusGetElem(SqListL,inti,ElemType&e){
if(i<1||i>L.length){
printf("Wrongvalueoftheserialnumber%d",i);
returnERROR;
}
e=L.elem[i-1];
returnOK;
}
测试结果:
表中元素分别为:
0,2,4,6
2.3.7LocatElem功能
获取指定元素编号,传入头结点值、存储了所需元素信息的一个临时表结点值、equal函数地址。
采用顺序比较法从表头遍历并比较,一旦找到,返回编号i。
时间复杂度为
O(n)。
statusLocatElem(SqListL,ElemTypee){
intj;
for(j=1;j if(e==L.elem[j])returnj; } returnERROR; } 测试结果: 表中元素分别为: 2,4,6 2.3.8PriorElem功能 求指定元素的前一个元素的内容,传入头结点值、包含指定元素信息的一个临时表结点值、存储前一个元素的表结点地址。 主要思路是先调用LocatElem确定指定元素的位置,如果不是首结点则可直接取到PriorElem的地址。 时间复杂度为O(n)。 具体实现如下: statusPriorElem(SqListL,ElemTypecur,ElemType&pre_e){ intloc; if(loc=LocatElem(L,cur)){ if(loc>1){ pre_e=L.elem[loc-1]; return1; } elseprintf("Theelementisthefirstoneinthelist"); } else{ printf("Theelementisnotexited"); } return0; } 测试结果: 表中元素为: 1,2,3,4 2.3.9NextElem功能 求指定元素的后一个元素的内容,与PriorElem功能类似,不再赘述。 statusNextElem(SqListL,ElemTypecur,ElemType&next_e){ intloc; if(loc=LocatElem(L,cur)){ if(loc next_e=L.elem[loc+1]; return1; } elseprintf("Theelementisthelastoneinthelist"); } else{ printf("Theelementisnotexited"); } return0; } 测试结果: 表中元素为: 1,2,3,4,5 ListInsert功能 插入一个数据元素,传入头结点地址、插入位置i、临时表结点值。 在调用插入函数前构造一个临时表结点,用于存储数据元素信息。 进入插入子函数,插入前先判断插入位置是否合理,再判断是否“满载”。 如果满载则重新申请更大的存储空间。 接下来正式插入数据元素,“先空位置再插入”。 平均时间复杂度为 ,O(n)。 statusListInsert(SqList&L,inti,ElemTypee){ ElemType*q; ElemType*p; ElemType*newbase; if(i<1||i>L.length+1)returnERROR; if(L.length>=L.listsize){ newbase=(ElemType*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType)); if(! newbase)exit(OVERFLOW); L.elem=newbase; L.listsize+=LISTINCREMENT; } q=&(L.elem[i-1]); for(p=&(L.elem[L.length-1]);p>=q;--p)*(p+1)=*p; *q=e; ++L.length; returnOK; } 测试结果: 插入前: 插入后: ListDelete功能 删除指定编号的数据元素,传入头结点地址、编号i、表结点类型结构体地址来返回被删除元素内容。 执行前先判断传入的编号是否在可寻找范围内。 执行删除操作之后,进行“移位”运算。 时间复杂度仍为O(n)。 如下: statusListDelete(SqList&L,inti,ElemType&e){ ElemType*q; ElemType*p; if(i<1||i>L.length)returnERROR; p=&(L.elem[i-1]); e=*p; q=L.elem+L.length-1; for(++p;p<=q;++p)*(p-1)=*p; --L.length; returnOK; } 测试结果: 删除前: 删除后: ListTrabverse功能 顺序遍历顺序表元素,传入头结点值。 时间复杂度为O(n)。 statusListTrabverse(SqListL){ inti; printf("\n--------------------allelements------------------------------\n"); for(i=0;i printf("\n-------------------------end----------------------------------\n"); returnL.length; } 测试结果: 2.4效率分析 在上面介绍各功能时已经提到时间复杂度的计算了,这里再简单分析一下。 具有同数量级复杂度的功能在实现方法上一般近似。 LocatElem、PriorElem、NextElem是基于LocatElem,平均效率为O(n);由于在头结点结构体中已经包含了ListEmpty、ListLength所需信息,所以效率为O (1);ListInsert、ListDelete都要对顺序表进行“移位”运算,平均效率为O(n)。 3实验二基于链式结构的线性表实现 3.1问题描述 基于链式存储结构,实现线性表的基本的、常见的运算。 3.2系统设计 该程序共有12个功能: 数据元素类型定义为: typedefintstatus; typedefintElemType; 线性表(链式结构)的定义为: typedefstructLNode{ intlength; ElemTypedata; structLNode*next; }LNode,*LinkList; 3.3系统实现 3.3.1CreateList功能 创建一个有n个元素的链表,每次输入新元素后,生成新结点,添加到表尾, 设置新表尾。 statusCreateList(LinkList&L,intn){ inte,i=1; LNode*p,*tail; L=(LinkList)malloc(sizeof(LNode)); tail=L; scanf("%d",&e); while(i p=(LinkList)malloc(sizeof(LNode)); p->data=e; tail->next=p; tail=p
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程 实验 报告 13