华中科技大学计算机学院数据结构实验报告.docx

上传人:b****7 文档编号:9801502 上传时间:2023-02-06 格式:DOCX 页数:127 大小:263.75KB
下载 相关 举报
华中科技大学计算机学院数据结构实验报告.docx_第1页
第1页 / 共127页
华中科技大学计算机学院数据结构实验报告.docx_第2页
第2页 / 共127页
华中科技大学计算机学院数据结构实验报告.docx_第3页
第3页 / 共127页
华中科技大学计算机学院数据结构实验报告.docx_第4页
第4页 / 共127页
华中科技大学计算机学院数据结构实验报告.docx_第5页
第5页 / 共127页
点击查看更多>>
下载资源
资源描述

华中科技大学计算机学院数据结构实验报告.docx

《华中科技大学计算机学院数据结构实验报告.docx》由会员分享,可在线阅读,更多相关《华中科技大学计算机学院数据结构实验报告.docx(127页珍藏版)》请在冰豆网上搜索。

华中科技大学计算机学院数据结构实验报告.docx

华中科技大学计算机学院数据结构实验报告

华中科技大学-计算机学院-数据结构实验报告

 

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()。

一旦

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1