华中科技大学计算机学院数据结构实验报告.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;iprintf("\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()。
一旦