华中科技大学计算机学院数据结构实验报告.docx
- 文档编号:9801502
- 上传时间:2023-02-06
- 格式:DOCX
- 页数:127
- 大小:263.75KB
华中科技大学计算机学院数据结构实验报告.docx
《华中科技大学计算机学院数据结构实验报告.docx》由会员分享,可在线阅读,更多相关《华中科技大学计算机学院数据结构实验报告.docx(127页珍藏版)》请在冰豆网上搜索。
华中科技大学计算机学院数据结构实验报告
华中科技大学-计算机学院-数据结构实验报告
1基于顺序存储结构实现线性表的基本运算
1.1实验目的
通过实验达到:
(1)加深对线性表的概念、基本运算的理解;
(2)熟练掌握线性表的逻辑结构与物理结构的关系;(3)物理结构采用顺序表,熟练掌握线性表的基本运算的实现。
1.2线性表演示系统设计
1.2.1系统总体设计
本系统提供一个顺序存储的线性表。
该演示系统提供的操作有:
表的初始化、销毁、清空、判空,求表长、获取数据元素、查找数据元素、获得前驱、获得后继、创建线性表、插入数据元素、删除数据元素、表的遍历。
在程序中实现消息处理,包括数据的输入和输出,程序的退出。
1.2.2有关常量和类型定义
数据元素类型的定义:
typedefintstatus;
typedefintElemType;
有关常量的定义:
#defineTRUE1
#defineFALSE0
#defineOK1
#defineERROR0
#defineINFEASTABLE-1
#defineOVERFLOW-2
#defineLIST_INIT_SIZE100
#defineLISTINCREMENT10
1.2.3算法设计
(1)InitaList(&L)
操作结果:
构造一个空的线性表。
(2)DestroyList(&L)
初始条件:
线性表L已存在。
操作结果:
销毁线性表L。
(3)ClearList(&L)
初始条件:
线性表L已存在。
操作结果:
将L重置为空表。
(4)ListEmpty(L)
初始条件:
线性表L已存在。
操作结果:
若L为空表,则返回TRUE,否则返回FALSE。
(5)ListLength(L)
初始条件:
线性表已存在。
操作结果:
返回L中数据元素的个数。
(6)GetElem(L,i,&e)
初始条件:
线性表已存在,1≤i≤ListLength(L)。
操作结果:
用e返回L中第i个数据元素的值。
(7)LocateElem(L,e,compare())
初始条件:
线性表已存在。
操作结果:
返回L中第1个与e满足关系compare()关系的数据元素的
位序,若这样的数据元素不存在,则返回值为0。
(8)PriorElem(L,cur_e,&pre_e)
初始条件:
线性表L已存在。
操作结果:
若cur_e是L的数据元素,且不是第一个,则用pre_e返回它的前驱,否则操作失败,pre_e无定义。
(9)NextElem(L,cur_e,&next_e)
初始条件:
线性表L已存在。
操作结果:
若cur_e是L的数据元素,且不是最后一个,则用next_e返回它
的后继,否则操作失败,next_e无定义。
(10)ListInsert(&L,i,e)
初始条件:
线性表L已存在且非空,1≤i≤ListLength(L)+1。
操作结果:
在L的第i个位置之前插入新的数据元素e,L的长度加1
(11)ListDelete(&L,i,&e)
初始条件:
线性表L已存在且非空,1≤i≤ListLength(L)。
操作结果:
删除L的第i个数据元素,用e返回其值,L的长度减1.
(12)ListTraverse(L,visit())
初始条件:
线性表L已存在。
操作结果:
依次对L的每个数据元素调用函数visit()。
一旦调用失败,则操
作失败。
1.3线性表演示系统实现与测试
1.3.1系统实现
编程环境为VisualStudio2015,程序清单如下:
#define_CRT_SECURE_NO_WARNINGS
/*LinearTableOnSequenceStructure*/
#include
#include
#include
/*---------page10ontextbook---------*/
#defineTRUE1
#defineFALSE0
#defineOK1
#defineERROR0
#defineINFEASTABLE-1
#defineOVERFLOW-2
typedefintstatus;
typedefintElemType;//数据元素类型定义
/*-------page22ontextbook-------*/
#defineLIST_INIT_SIZE100
#defineLISTINCREMENT10
typedefstruct{//顺序表(顺序结构)的定义
ElemType*elem;
intlength;
intlistsize;
}SqList;
/*-----page19ontextbook---------*/
statusIntiaList(SqList&L);
statusDestroyList(SqList*L);
statusClearList(SqList&L);
statusListEmpty(SqListL);
intListLength(SqListL);
statusGetElem(SqListL,inti,ElemType&e);
intLocateElem(SqListL,ElemTypee);//简化过
statusPriorElem(SqListL,ElemTypecue,ElemType*pre);
statusNextElem(SqListL,ElemTypecue,ElemType*next);
statusListInsert(SqList*L,inti,ElemTypee);
statusListDelete(SqList*L,inti,ElemType*e);
statusListTrabverse(SqListL);//简化过
ElemTypee;
/*--------------------------------------------*/
voidmain(void){
SqListL;
intop=1,e,cue,pre,next,m;
while(op){
system("cls");
printf("\n\n");
printf("MenuforLinearTableOnSequenceStructure\n");
printf("-------------------------------------------------\n");
printf("1.IntiaList7.LocateElem\n");
printf("2.DestroyList8.PriorElem\n");
printf("3.ClearList9.NextElem\n");
printf("4.ListEmpty10.ListInsert\n");
printf("5.ListLength11.ListDelete\n");
printf("6.GetElem12.ListTrabverse\n");
printf("0.Exit\n");
printf("-------------------------------------------------\n");
printf("请选择你的操作[0~12]:
");
scanf("%d",&op);
switch(op)
{
case1:
//printf("\n----IntiaList功能待实现!
\n");
if(IntiaList(L)==OK)printf("线性表创建成功!
\n");
elseprintf("线性表创建失败!
\n");
getchar();getchar();
break;
case2:
//printf("\n----DestroyList功能待实现!
\n");
if(DestroyList(&L)==OK)printf("线性表销毁成功!
\n");
elseprintf("线性表销毁失败!
\n");
getchar();getchar();
break;
case3:
//printf("\n----ClearList功能待实现!
\n");
if(ClearList(L)==OK)printf("线性表清空成功!
\n");
elseprintf("线性表清空失败!
\n");
getchar();getchar();
break;
case4:
//printf("\n----ListEmpty功能待实现!
\n");
if(ListEmpty(L)==OK)printf("线性表已清空!
\n");
elseprintf("线性表未清空!
\n");
getchar();getchar();
break;
case5:
//printf("\n----ListLength功能待实现!
\n");
printf("线性表长度为%d\n",ListLength(L));
getchar();getchar();
break;
case6:
//printf("\n----GetElem功能待实现!
\n");
inti;
printf("请输入要查询的序数:
");
scanf("%d",&i);
if(GetElem(L,i,e)==OK)printf("表中第%d个数据为%d\n",i,e);
elseprintf("查询失败!
\n");
getchar();getchar();
break;
case7:
//printf("\n----LocateElem功能待实现!
\n");
printf("请输入要查询的数据:
\n");
scanf("%d",&e);
m=LocateElem(L,e);
if(m!
=ERROR)
{
printf("L中第一个与查询数据相等的数据的位序为%d\n",m);
}
else
{
printf("这样的数据元素不存在!
\n");
}
getchar();getchar();
break;
case8:
printf("请输入要查询的元素:
");
scanf("%d",&cue);
if(PriorElem(L,cue,&pre)==OK)printf("前驱为%d\n",pre);
elseprintf("无此前驱\n");
getchar();getchar();
break;
case9:
printf("请输入要查询的元素:
");
scanf("%d",&cue);
if(NextElem(L,cue,&next)==OK)printf("后驱为%d\n",next);
elseprintf("无此后驱\n");
getchar();getchar();
break;
case10:
printf("请输入i:
");
scanf("%d",&i);
printf("请输入e:
");
scanf("%d",&e);
if(ListInsert(&L,i,e)==OK)printf("线性表插入成功\n");
elseprintf("线性表插入失败\n");
getchar();getchar();
break;
case11:
printf("请输入要删除的元素的序列:
");
scanf("%d",&i);
if(ListDelete(&L,i,&e)==OK)printf("元素删除成功\n");
elseprintf("元素删除失败\n");
getchar();getchar();
break;
case12:
//printf("\n----ListTrabverse功能待实现!
\n");
if(!
ListTrabverse(L))printf("线性表是空表!
\n");
getchar();getchar();
break;
case0:
break;
}//endofswitch
}//endofwhile
printf("欢迎下次再使用本系统!
\n");
}//endofmain()
/*--------page23ontextbook--------------------*/
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;
}
statusDestroyList(SqList*L)
{
free(L->elem);
L->elem=NULL;
returnOK;
}
statusClearList(SqList&L)
{
L.length=0;
returnOK;
}
statusListEmpty(SqListL)
{
if(L.length==0)
{
returnTRUE;
}
else
{
returnERROR;
}
}//判断表空
intListLength(SqListL)
{
returnL.length;
}
statusGetElem(SqListL,inti,ElemType&e)
{
e=*(L.elem+i-1);
returne;
}
intLocateElem(SqListL,ElemTypee)
{
intk=1;
while(*L.elem!
=e)
{
L.elem++;
k++;
if(k>L.length)
{
returnERROR;
}
}
returnk;
}
statusPriorElem(SqListL,ElemTypecue,ElemType*pre)
{
inti;
for(i=1;i { if(L.elem[i]==cue) { *pre=(int)L.elem[i-1]; returnOK; } } returnFALSE; } statusNextElem(SqListL,ElemTypecue,ElemType*next) { intm; for(m=0;m { if(L.elem[m]==cue) { *next=(int)L.elem[m+1]; returnOK; } } returnFALSE; } statusListInsert(SqList*L,inti,ElemTypee) { ElemType*nw,*t,*p; if(! L->elem)returnERROR; if(i<1||i>L->length+1)returnERROR; if(L->length>=L->listsize) { nw=(ElemType*)realloc(L->elem,(L->listsize+LISTINCREMENT)*sizeof(ElemType)); if(! nw)returnERROR; L->elem=nw; L->listsize+=LISTINCREMENT; } t=&(L->elem[i-1]); for(p=&(L->elem[L->length-1]);p>=t;p--) { *(p+1)=*p; } *t=e; ++L->length; returnOK; } statusListDelete(SqList*L,inti,ElemType*e) { ElemType*t,*p; if(i<1||i>L->length||! L->elem)returnERROR; p=&(L->elem[i-1]); e=p; t=&(L->elem[L->length-1]); for(p++;p<=t;++p) *(p-1)=*p; --L->length; returnOK; } statusListTrabverse(SqListL) { inti; printf("\n-----------allelements-----------------------\n"); for(i=0;i printf("\n------------------end------------------------\n"); returnL.length; } 1.3.2系统测试 表1-1线性表算法测试用例表 测试用例 程序输入 理论结果 运行结果 用例1 1 线性表创建成功 用例2 2 线性表销毁成功 用例3 3 线性表清空成功 用例4 4 线性表已清空 用例5 5 线性表长度为0 用例6 6 表中第1个数据为1 用例7 7 表中第一个与查询数据相等的数据的位序为1 用例8 8 前驱为5 用例9 9 后驱为1 用例10 10 线性表插入成功 用例11 11 元素删除成功 用例12 12 521 1.4实验小结 这是第一次数据结构的实验,实验完成期间恰逢离散和复变的考试,复习与实验一起进行让我压力不小。 好在老师有针对性的在课堂上指点了很多关键点,让我的实验顺利进行。 此次实验加深了我对*L和&L的理解,代码中仍有不尽如人意的地方,相信以后会做的越来越好。 2基于链式实现线性表的基本运算 2.1问题描述 通过实验达到: (1)加深对线性表的概念、基本运算的理解; (2)熟练掌握线性表的逻辑结构与物理结构的关系;(3)物理结构采用带表头结点的单链表,熟练掌握线性表基本运算的实现。 2.2线性表演示系统设计 2.2.1系统总体设计 本系统提供一个链式存储的线性表。 该演示系统提供的操作有: 表的初始化、销毁、清空、判空,求表长、获取数据元素、查找数据元素、获得前驱、获得后继、创建线性表、插入数据元素、删除数据元素、表的遍历。 在程序中实现消息处理,包括数据的输入和输出,程序的退出。 2.2.2有关常量和类型定义 数据元素类型的定义: typedefintstatus; typedefintElemType; 有关常量的定义: #defineTRUE1 #defineFALSE0 #defineOK1 #defineERROR0 #defineINFEASTABLE-1 #defineOVERFLOW-2 #defineLIST_INIT_SIZE100 #defineLISTINCREMENT10 2.2.3算法设计 (1)InitaList(&L) 操作结果: 构造一个空的单链表。 (2)DestroyList(&L) 初始条件: 单链表L已存在。 操作结果: 销毁单链表L。 (3)ClearList(&L) 初始条件: 单链表L已存在。 操作结果: 将L重置为空单链表。 (4)ListEmpty(L) 初始条件: 单链表L已存在。 操作结果: 若L为空单链表,则返回TRUE,否则返回FALSE. (5)ListLength(L) 初始条件: 单链表已存在。 操作结果: 返回L中数据元素的个数。 (6)GetElem(L,i,&e) 初始条件: 单链表已存在,1≤i≤ListLength(L)。 操作结果: 用e返回L中第i个结点的数据元素值。 (7)LocateElem(L,e,compare()) 初始条件: 单链表已存在。 操作结果: 返回L中第1个与e满足关系compare()的数据元素结点的指 针,若这样的数据元素不存在,则返回值为NULL。 (8)PriorElem(L,cur_e,&pre_e) 初始条件: 单链表L已存在。 操作结果: 若cur_e是L的数据元素,且不是第一个,则用pre_e返回它的 前驱,否则操作失败,pre_e无定义。 (9)NextElem(L,cur_e,&next_e) 初始条件: 单链表L已存在。 操作结果: 若cur_e是L的数据元素,且不是最后一个,则用next_e返回它 的后继,否则操作失败,next_e无定义。 (10)ListInsert(&L,i,e) 初始条件: 单链表L已存在且非空,1≤i≤ListLength(L)+1。 操作结果: 在L的第i个结点之前插入新数据元素e的结点。 (11)ListDelete(&L,i,&e) 初始条件: 单链表L已存在且非空,1≤i≤ListLength(L)。 操作结果: 删除L第i个数据元素的结点,用e返回其结点数据元素的值。 (12)ListTraverse(L,visit()) 初始条件: 单链表L已存在。 操作结果: 依次对L的每个数据元素调用函数visit()。 一旦
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 华中科技大学 计算机 学院 数据结构 实验 报告