某大学数据结构实验报告_第1页
某大学数据结构实验报告_第2页
某大学数据结构实验报告_第3页
某大学数据结构实验报告_第4页
某大学数据结构实验报告_第5页
已阅读5页,还剩107页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

年卡科找夫穿

课程实验报告

课程名称:数据结构实验

专业班级:

学号:

姓名:

指导教师:

报告日期:2015年11月20日

计算机科学与技术学院

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

目录

1基于顺序存储结构实现线性表的基本运算..............................1

1.1问题描述......................................................1

1.2顺序表演示系统设计............................................3

1.2.1系统总体设计.................................................3

1.2.2有关常量和类型定义...........................................3

1.2.3算法设计.....................................................3

1.3顺序表演示系统实现与测试.....................................8

1.3.1系统实现.....................................................8

1.3.2系统测试....................................................18

1.4实验小结.....................................................20

2基于链式存储结构实现线性表的基本运算.............................20

2.1问题描述......................................................20

2.2单链表演示系统设计............................................21

2.2.1系统总体设计................................................21

2.2.3算法设计....................................................22

2.3单链表演示系统实现与测试...................................24

2.3.1系统实现...................................................24

2.3.2系统测试...................................................36

2.4实验小结....................................................37

3基于顺序存储结构实现栈的基本运算.................................38

3.1顺序栈实验..................................................38

3.1.1问题描述.....................................................38

3.1.2顺序栈设计...................................................38

3.1.2顺序栈实现与测试.............................................44

3.2表达式求值实验................................................55

3.2.1问题描述....................................................55

3.2.2算法设计部分.................................................55

3.2.3实现与测试部分...............................................56

3.3实验小结.....................................................57

4基于循环队列存储结构实现队列的基本运算...........................58

4.1问题描述.......................................................58

4.2队列基本操作算法设计:........................................58

4.3实验小结......................................................66

5基于二叉链表实现二叉树的基本运算.................................67

5.1实验内容与要求................................................67

5.2程序概要设计..................................................67

5.3数据结构与算法设计............................................68

5.4程序清单与测试................................................70

5.5实验总结与评价................................................83

6基于邻接表实现图的基本运算.......................................84

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

6.1实验内容与要求.................................................84

6.2程序概要设计...................................................84

6.3数据结构与算法设计.............................................85

6.4程序清单与测试.................................................87

6.5实验总结与评价................................................109

参考文献.........................................................109

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

1基于顺序存储结构实现线性表的基本运算

1.1问题描述

叙述实验中线性表的物理结构形式,如何用物理结构表示数据元素间的逻辑关系,可用

图的方式直观表示物理结构,如图1-1所示。

实验要完成的顺序表算法:

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

初始条件:线性表已存在,iWiWListLength(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已存在且非空,1WiWListLength(L)+l。

操作结果:在L的第i个位置之前插入新的数据元素e,L的长度加1

(11)ListDelete(&L,i,&e)

初始条件:线性表L已存在且非空,iWiWListLength(L)。

操作结果:删除L的第i个数据元素,用e返回其值,L的长度减1.

(12)LislTraverse(L,visit())

初始条件:线性表L已存在。

操作结果:依次对L的每个数据元素调用函数visit。。一旦调用失败,则操

作失败。

(13)ReadList(&L)

操作结果:读取线性表

(14)SaveList(L)

操作结果:保存线性表

实验目标:

构造成具有功能菜单的系统完成线性表基本操作。通过实验达到:(1)加深对线性表的

概念、基本运算的理解;(2)熟练掌握线性表的逻辑结构与物理结构的关系;(3)物理结构

采用顺序表,熟练掌握线性表的基本运算的实现。

-2-

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

1.2顺序表演示系统设计

1.2.1系统总体设计

系统的总体架构:界面上采用简易菜单,通过switch函数进行功能的选择,进入相关

功能函数执行相关操作。

1.2.2有关常量和类型定义

typedefintElemType;//数据元素类型定义

#defineLISTJNIT.SIZE100

#defineLISTINCREMENT10

typedefstruct{//顺序表(顺序结构)的定义

ElemType*elem;

intlength;

intlistsize;

JSqList;

1.2.3算法设计

(1)InitaList(&L)

设计:分配存储空间,并将length值设为0,listsize值设为预定义的初始存储容量。

复杂度:时间复杂度T(n)=O(l)

空间复杂度S(n)=O(l)

(2)DestroyList(&L)

设计:释放内存,并让ele指向NULL,表长及存储容量置为0。

复杂度:时间复杂度T(n)=O(l)

空间复杂度S(n)=O(l)

(3)ClearList(&L)

设计:将表长设为0。

复杂度:时间复杂度T(n)=O(l)

空间复杂度S(n)=O(l)

(4)ListEmpty(L)

设计:读取表长length的值,为0则返回TRUE,否则FALSE。

复杂度:时间复杂度T(n)=O(l)

------------------------------------------------------------------3------------------------------------------------------------------

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

空间复杂度S(n)=O(l)

(5)ListLength(L)

设计:返回L.length的值。

复杂度:时间复杂度T(n)=O(l)

空间复杂度S(n)=O(l)

(6)GetElem(L,i,&e)

设计:将L.elem[i-1]的值赋给e,并返回OK

复杂度:时间复杂度T(n)=O(l)

空间复杂度S(n)=O(l)

(7)LocateElem(L,e,compare())

设计:遍历顺序表,将与给定元素e满足关系compare的元素的位序返回。

复杂度:时间复杂度T(n)=O(n)

空间复杂度S(n)=O(l)

(8)PriorElem(L,cur_e,&pre_e)

设计:从头遍历,若当前节点后继值为cur_e,则将当前结点的元素赋给pre_e,

returnOK«若未找到,则返回FALSE。流程图如下所示:

复杂度:时间复杂度T(n)=O(n)

空间复杂度S(n)=O(l)

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

(9)NextElem(L,cur_e,&next_e)

设计:从头遍历,若当前节点值为cur_e且非表尾,则将后继结点的元素赋给pre_e,

returnOK,若未找到,则返回FALSE。流程图如下:

复杂度:时间复杂度T(n)=O(n)

空间复杂度S(n)=O(l)

-5.

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

(10)ListInsert(&L,i,e)

设计:先判断i值是否符合要求,不符返回ERROR。i值合法,则检查空间大小,

若空间不够,增加存储容量。然后将插入位置及之后的元素右移,最后插入e,表长加

一。流程图如下所示:

复杂度:时间复杂度T(n)=O(n)

空间复杂度S(n)=O(l)

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

(1l)ListDelete(&L,i,&e)

设计:先判断i值是否符合要求,不符返回ERROR。i值合法,则将被删除元素的

值赋给e,然后将被删除元素之后的元素左移,最后表长减一。

复杂度:时间复杂度T(n)=O(n)

空间复杂度S(n)=O(l)

(12)ListTraverse(L,visit())

设计:遍历顺序表,对每个元素调用函数指针visit所指向的函数,若调用失败则

提示操作失败。

复杂度:时间复杂度T(n)=O(n)

空间复杂度S(n)=O(l)

(13)ReadList(&L)

设计:若原L已存在,销毁,新建,再要求用户输入读取文件名,然后使用fread

函数进行文件的读取。

复杂度:时间复杂度T(n)=O(n)

空间复杂度S(n)=O(l)

(14)SaveList(L)

设计:让用户输入所要保存到的文件名,然后使用fwrite函数将顺序表保存入文件

中。

-7-

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

复杂度:时间复杂度T(n)=O(l)

空间复杂度S(n)=O(l)

1.3顺序表演示系统实现与测试

1.3.1系统实现

编程环境:WIN10下使用Dev—C++进行编译调试,语言选择C语言。

各函数间调用关系:主函数通过switch调用各功能函数,各函数间除ReadList调用

DestroyList和InitList外,各自相互独立。

程序源代码:

#include<stdio.h>

#include<stdlib.h>

〃函数结果状态代码

#defineTRUE1

#defineFALSE0

#defineOK1

#defineERROR0

#defineINFEASTABLE-1

#defineOVERFLOW-2

//Status是函数的类型,其值是函数结果状态代码

typedefintStatus;

//数据元素类型定义

typedefintElemType;

#defineLIST_INIT_SIZE100

#defineLISTINCREMENT10

typedefstruct{//顺序表(顺序结构)的定义

ElemType*elem;

intlength;

intlistsize;

-8-

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

JSqList;

StatusInitList(SqList*L);

StatusDestroyList(SqList*L);

StatusClearList(SqList*L);

StatusListEmpty(SqListL);

intListLength(SqListL);

StatusGetElem(SqListL,inti,ElemType*e);

intLocateElem(SqListL,ElemTypee,Status(*compare)(ElemTypea,ElemTypeb));

StatusPriorElem(SqListL,ElemTypecur_e,ElemType*pre_e);

StatusNextElem(SqListL,ElemTypecur_e,ElemType*next_e);

StatusListInsert(SqList*L,inti,ElemTypee);

StatusListDelete(SqList*L,inti,ElemType*e);

StatusListTraverse(SqListL,Status(*visit)(ElemTypea));

StatusReadList(SqList*L);

StatusSaveList(SqListL);

StatusCompare(ElemTypea,ElemTypeb);

StatusVisit(ElemTypea);

/*

*函数名称:IntiaList

*输入参数:线性表L地址

*返回值:Status

*函数功能:构造一个空的线性表。

*/

StatuslnitList(SqList*L)

(

L->elem=(ElemType*)maHoc(LIST」NIT_SIZE*sizeof(ElemType));

if(!L->elem)

(

exit(OVERFLOW);

L->length=0;

L->listsize=LISTJNIT_SIZE;

returnOK;

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

*函数名称:DestroyList

*输入参数:线性表L地址

*返回值:Status

*函数功能:构造•个空的线性表。

*/

StatusDestroyList(SqList*L)

(

free(L->elem);

L->elem=NULL;

L->length=0;

L->listsize=O;

returnOK;

)

*函数名称:ClearList

*输入参数:线性表L地址

*返回值:Status

*函数功能:将L重置为空表。

*/

StatusClearList(SqList*L)

(

L->length=0;

returnOK;

*函数名称:ListEmpty

*输入参数:线性表L

*返回值:Status

*函数功能:若L为空表,则返回TRUE,否则返回FALSE。

*/

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

StatusListEmpty(SqListL)

(

if(L.length==0)

(

returnTRUE;

)

else

(

returnFALSE;

*函数名称:ListLength

*输入参数:线性表L

*返回值:Status

*函数功能:返回L中数据元素的个数。

*/

intListLength(SqListL)

(

returnL.length;

*函数名称:GetElem

*输入参数:线性表L,结点位置i,用于返回的e的地址

*返回值:Status

*函数功能:用e返回L中第i个数据元素的值。

*/

StatusGetElem(SqListL,inti,ElemType*e)

(

if((i<l)ll(i>L.length))

(

returnERROR;

II

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

*e=L.elem[i-1];

returnOK;

)

/*

*函数名称:LocateElem

*输入参数:线性表L,用于比较的元素e,指向用于比较的函数的函数指针compare

*返回值:im

*函数功能:返回L中第1个与e满足关系compare()关系的数据元素的

*位序,若这样的数据元素不存在,则返回值为0。

intLocateElem(SqListL,ElemTypee,Status(*compare)(ElemType,ElemType))

(

inti;

for(i=1;i<=L.length;i++)

(

if((*compare)(L.elem[i-l]»e))

(

return(i);

)

)

return0;

)

/*

*函数名称:PriorElem

*输入参数:线性表L,找的元素cur_e,用于返回其前驱的元素pre_e的地址

*返回值:Status

*函数功能:若cuje是L的数据元素,且不是第一个,则用pre_e返回它的前驱,否则操作

失败,pre_e无定义。

*/

StatusPriorElem(SqListL,ElemTypecur_e,ElemType*pre_e)

inti;

for(i=0;i<(L.length-1);i++)

12-

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

if(L.elem[i+1]==cur_e)

(

*pre_e=L.elem[i];

returnOK;

)

)

returnERROR;

*函数名称:NextElem

*输入参数:线性表L,查找的元素cuje,用于返回其后继的元素next_e的地址

*返回值:Status

*函数功能:若cuje是L的数据元素,且不是最后一个,则用next_e返回它

*的后继,否则操作失败,next_e无定义。

*/

StatusNextElem(SqListL,ElemTypecur_e,ElemType*next_e)

(

inti;

for(i=0;i<(L.length-1);i++)

(

if(L.elem[i]==cur_e)

(

*next_e=L.elem[i+1];

returnOK;

)

}

returnERROR;

)

/*

*函数名称:Listinsert

*输入参数:线性表L地址,插入位置i,插入元素e

*返回值:Status

*函数功能:在L的第i个位置之前插入新的数据元素e,L的长度加1

13-

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

*/

StatusListInsert(SqList*L,inti,ElemTypee)

(

if(i<1||i>L->length+l)//i值不合法

(

returnERROR;

)

if(L->length>=L->listsize)〃当前存储空间已满,增加分配

(

ElemType*newbase;

newbase=(ElemType*)realloc(L->elem,(L->listsize+

LISTINCREMENT)*sizeof(ElemType));

if(!newbase)

(

exit(OVERFLOW);//存储分配失败

)

L->elem=newbase;〃新基址

L->listsize+=LISTINCREMENT;〃增力口存储容量

)

ElemType*p,*q;

q二&(L->elem[i-l]);//q为插入位置

for(p=&(L->elem[L->length-l]);p>=q;—p)

(

*(p+l)=*p;〃插入位置及之后的元素右移

)

*q=e;//插入e

++L->length;〃表长增加1

returnOK;

*函数名称:ListDelete

*输入参数:线性表L地址,删除位置i,用于返回其值的元素e的地址

*返回值:Status

14-

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

*函数功能:删除L的第i个数据元素,用e返回其值,L的长度减1.

*/

StatusListDelete(SqList*L,inti,ElemType*e)

(

ElemType*p,*q;

if(i<1||i>L->length)//i值不合法

(

returnERROR;

)

p=&(L->elem[i-l]);//p为被删元素位置

*e=*p;//被删除元素的值赋给e

q=L->elem+L->length-1;//表尾元素的位置

for(++p;p<=q;++p)//被删除元素之后的元素左移

(

*(p-l)=*p;

)

--L->length;〃表长减1

returnOK;

*函数名称:ListTraverse

*输入参数:线性表L,指向调用函数的函数指针visit

*返回值:Status

*函数功能:依次对L的每个数据元素调用函数visit()o

StatusListTraverse(SqListL,Status(*visit)(ElemTypea))

(

inti;

printf("\n-----------allelements------------------------\nn);

for(i=0;i<L.length;i++)

(

if(!(*visit)(L.elem[i]))

15

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

printf("操作失败!”);

)

)

printf("\n------------------end--------------------------\n");

returnL.length;

”函数名称:ReadList

*输入参数:线性表L

*返回值:Status

去函数功能:读取线性表。

*/

StatusReadList(SqList*L)

(

if((*L).elem!=NULL)

(

DestroyList(L);

)

InitList(L);

FILE*fp;

charfilename[30];

printf(”请输入读取文件名:n);

scanf(,'%sM,&filename);

if((fp=fopen(filename,"r"))==NULL)

(

printf("文件打开失败!\n");

returnERROR;

}

whiIe(fread(&(L>>elem[L->length]),sizeof(ElemType),1,fp))

L->length++;

fclose(fp);

returnOK;

)

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

*函数名称:SaveList

*输入参数:线性表L

*返回值:Status

*函数功能:保存线性表。

StatusSaveList(SqListL)

(

FILE*fp;

charfilename[30];

printf(”请输入保存文件名:");

scanf("%s”,&filename);

〃写文件的方法

if((fp=fopen(filename,uw"))==NULL)

(

printf("文件打开失败\n”);

returnERROR;

)

fwrite(L.elem,sizeof(ElemType),L.length,fp);

fclose(fp);

returnOK;

*函数名称:Compare

*输入参数:ElemTypea,ElemTypeb

*返回值:Status

*函数功能:判断a,b是否满足关系

*/

StatusCompare(ElemTypea,ElemTypeb)

(

if(a==b)

returnTRUE;

17-

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

else

(

returnFALSE;

*函数名称:Visit

*输入参数:ElemTypea

*返回值:Status

・函数功能:输出a

*/

StatusVisit(ElemTypea)

(

printf(n%du,a);

returnOK;

}

1.3.2系统测试

使用预先保存的测试用例挑选LocateElem,NextElem,Listinsert,ListDelete>ListTraverse

进行测试。

使用的测试用例:Testi(表含5/2,0,44,94),Test2(空表)。

(1)LocateElem测试:

表1.3.2-1LocateElem算法测试用例表

测试用例程序输入理论结果运行结果

Testi1.主界面选择7进入函数输出“第二个元素符输出“第二个元素符合

2.按提示输入所要比较的函数合条件”。条件”,符合预期。

(本程序比较函数设为两数相

等返回TRUE,故提示语为输

入要搜寻的函数),输入12

L主界面选择7进入函数提示“未找到符合条输出“未找到符合条件

2.输入100件的元素”的元素”,符合预期。

Test2L主界面选择7进入函数提示“未找到符合条输出“未找到符合条件

2.输入100件的元素”的元素”,符合预期。

无1.主界面选择7进入函数提示“线性表不存输出“线性表不存在!

18-

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

在!请先创建!”请先创建!”,符合。

(2)NextElem测试:

表1.3.2-2NexlElem算法测试用例表

测试用例程序输入理论结果运行结果

Testi1.主界面选择9进入函数输出“该元素后继为输出“该元素后继为

2.输入120”。0”,符合预期。

1.主界面选择9进入函数提示“未找到”输出“未找到”,符合

2.输入100预期。

1.主界面选择9进入函数提示“未找到”输出“未找到”,符合

2.输入94预期。

Test21.主界面选择9进入函数提示“未找到”输出“未找到”,符合

2.输入12预期。

无1.主界面选择9进入函数提示“线性表不存输出“线性表不存在!

在!请先创建!”请先创建!”,符合。

(3)Listinsert测试:

表1.3.2-3Listinsert算法测试用例表

测试用例程序输入理论结果运行结果

Testi1.主界面选择10进入函数提示插入成功输出“插入成功!”

2.根据提示输入位置,输入1使用Traverse函数,使用Traverse函数,输

3.根据提示输入新元素,输入10得到表出“1051204494”,

10,5,12,0,44,94符合预期。

1.主界面选择10进入函数提示插入成功输出“插入成功!”

2输入6使用Traverse函数,使用Traverse函数,输

3.输入10得到表出“5120449410”,

5,12,0,44,94,10符合预期。

1.主界面选择10进入函数i值不符要求,提示输出“插入失败!请检

2.输入7插入失败查i值”,符合预期。

3.输入10

1.主界面选择10进入函数i值不符要求,提示输出“插入失败!请检

2.输入0插入失败查i值”,符合预期。

3.输入10

Test21.主界面选择10进入函数提示插入成功输出“插入成功!”

2.输入1使用Traverse函数,使用Traverse函数,输

3.输入10得到表10出“10”,符合预期。

1.主界面选择10进入函数i值不符要求,提示输出“插入失败!请检

2.输入2插入失败查i值”,符合预期。

3.输入10

1.主界面选择10进入函数i值不符要求,提示输出“插入失败!请检

2输入0插入失败查i值”,符合预期。

3.输入10

无1.主界面选择10进入函数提示“线性表不存输出“线性表不存在!

19-

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

在!请先创建!”请先创建!”,符合。

(4)ListDelete测试:(与上类似,故简化)

表1.324LislDelete算法测试用例表

测试用例程序输入理论结果运行结果

Testi1.主界面选择11进入函数提示插入成功输出“插入成功!”

2.根据提示输入位置,输使用Traverse函数,得使用Traverse函数,输出

入1到表12,0,44,94“1204494”,符合预期。

1.主界面选择10进入函数i值不符要求,提示插入输出''插入失败!请检查

2.输入0失败i值”,符合预期。

(5)ListTraverse测试:

表1.3.2-5ListTraverse算法测试用例表

测试用例程序输入理论结果运行结果

Testi主界面选择12进入函数得到表5,12,0,44,94输出“51204494M,符

合预期。

Test2主界面选择12进入函数提示线性表为空输出“线性表是空表”,

符合预期。

无主界面选择12进入函数提示“线性表不存在!输出“线性表不存在!请

请先创建!”先创建!”,符合。

1.4实验小结

本次实验加深了对线性表的概念、基本运算的理解,掌握了线性表的基本运算的实现。

熟练了线性表的逻辑结构与物理结构的关系。今后的学习过程中应当多从数据结构的角度分

析如何进行数据的处理、存储以方便问题的解决,并要勤加练习达到熟能生巧的地步。

2基于链式存储结构实现线性表的基本运算

2.1问题描述

-20-

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

掌握基于链式存储结构,实现线性表的基本的、常见的运算

2.2单链表演示系统设计

2.2.1系统总体设计

•共有17个基本函数,具体功能如下

(1)InitSqLisKSqList*L)

操作结果:创建链式表组。

(2)InitList(LinkList*L)

操作结果:构造一个空的链式表

(3)DestroyList(LinkList*L)

初始条件:链式表L已存在。

操作结果:销毁链式表L。

(4)ClearList(LinkList*L)

初始条件:链式表L已存在。

操作结果:将L重置为空链式表。

(5)LisiEmpty(LinkList*L)

初始条件:链式表L已存在。

操作结果:若L为空链式表,则返回TRUE,否则返回FALSE.

(6)ListLength(LinkList*L)

初始条件:链式表已存在。

操作结果:返回L中数据元素的个数。

(7)GetElem(LinkListL,inti,ElemType*e)

初始条件:单链表已存在,IWiWListLength(L)。

操作结果:用e返回L中第i个结点的数据元素值。

(8)LocateElem(LinkListL,ElemTypee,Status(*compare)(ElemTypea,ElemTypeb))

初始条件:链式表已存在。

操作结果:用e返回L中第i个数据元素的值。

(9)PriorElem(LinkListL.ElemTypecur_e,ElemType*pre_e)

初始条件:单链表L已存在。

操作结果:若cur_e是L的数据元素,且不是第一个,则用pre_e返回它的

前驱,否则操作失败,pre_e无定义。

(10)NextElem(LinkListL,ElemTypecur_e,ElemType*next_e)

初始条件:单链表L已存在。

操作结果:若cur_e是L的数据元素,且不是最后一个,则用next_e返回它

的后继,否则操作失败,next_e无定义。

-21

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

(II)ListInsert(LinkList*L,inti,ElemTypee)

初始条件:链式表L已存在且非空,lWiWListLength(L)+l。

操作结果:在L的第i个结点之前插入新数据元素e的结点。

(12)ListDelete(LinkList*L.inti,ElemType*e)

初始条件:链式表L已存在且非空,IWiWListLength(L)。

操作结果:删除L第i个数据元素的结点,用e返回其结点数据元素的值。

(13)ListTraverse(LinkListL,Status(*visit)(ElemTypea)

初始条件:链式表L已存在。

操作结果:依次对L的每个数据元素调用函数visit。。一旦调用失败,则操

作失败。

(14)ChooseList(LinkList*L,chars[J,SqListLO)

初始条件:链式表L已存在

操作结果:选取已有链式表组中的一组链式表

(15)DeleteList(LinkList*L,chars[],SqListLO)

初始条件:链式表L存在

操作结果:删除链式表L

(16)ReadList(SqList*L)

初始条件:文件夹中保存有链式表

操作结果:成功读取链式表L

(17)SaveList(SqListL)

初始条件:已创建链式表L

操作结果:将链式表L保存在创建的文件夹中

2.2.3算法设计

(1)InitSqList(SqList*L)

创建链表组,参数为各个链式表的表头指针地址,从而实现多个链式表的共同管理。

复杂度:时间复杂度T(n)=O(l)

空间复杂度S(n)=O(l)

(2)InitList(LinkList*L)

创建空链式表L分三步:1.分配空间2.将数据域初始化为零3.将指针域初始化为0。

时间复杂度T(n)=O(l)

空间复杂度S(n)=O(l)

(3)DestroyList(LinkList*L)

销毁链式表分2步:1.将上一个链式表与下一个链式表连接2.释放链式表

时间复杂度T(n)=O(l)

空间复杂度S(n)=O(l)

(4)ClearList(LinkList*L)

将链式表置空,先释放链式表的存储空间,再将上一个与下一个链式表连接,最后将自

-22-

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

身指针域置空处理,由此达到重置为空表的目的。

时间复杂度T(n)=O(l)

空间复杂度S(n)=O(l)

(5)ListEmpty(LinkList*L)

判断链式表是否为空。

时间复杂度T(n)=O(n)

空间复杂度S(n)=0(1)

(6)ListLength(LinkList*L)

遍历链表,利用计数器i统计链表元素个数。

时间复杂度T(n)=0(n)

空间复杂度S(n)=0(l)

(7)GetElem(LinkListL,inti,ElemType*e)

利用结点p遍历链式表L,再利用计数器j来判研是否到达所需位置i,如果到达,则

返回该处元素,达到函数目的。

时间复杂度T(n)=0(n)

空间复杂度S(n)=0(l)

(8)LocateElem(LinkListL,ElemTypee,Status(*compare)(ElemTypea,ElemTypeb))

利用p指针遍历链表,再运用compare函数进行比较,如果在遍历过程中找到元素e

则返回此时计数器i,就是该元素在链表中的位置,由此实现函数功能。

时间复杂度T(n)=0(n)

空间复杂度S(n)=O(l)

(9)PriorElem(LinkListL,ElemTypecur_e,ElemType*pre_e)

参数为链表头指针L,查找的元素cure,用于返回其前驱的元素pree的地址,Status

成功则返回OK,未找到返回ERROR,若cuje是L的数据元素,且不是第一个,则用pre_e

返回它的前驱,否则操作失败,pre_e无定义。

时间复杂度T(n)=0(n)

空间复杂度S(n)=O(l)

(10)NextElem(LinkListL,ElemTypecur_e,ElemType*next_e)

参数为链表头指针L,Status成功则返回OK,未找到返回ERROR,若cur_e是L的数

据元素,且不是第•个,则用next_e返回它的后驱,否则操作失败,next_e无定义。

时间复杂度T(n)=O(n)

空间复杂度S(n)=O(l)

(11)ListInsert(LinkList*L,inti,ElemTypee)

输入参数:链表头指针地址&L插入位置i,插入元素e,在L的第i个结点之前插入

-23.

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

新数据元素e的结点。

时间复杂度T(n)=0(n)

空间复杂度S(n)=O(l)

(12)ListDelete(LinkList*L,inti,ElemType*e)

链表头指针L,删除位置i,用于返回其值的元素e的地址,删除L第i个数据元素的

结点,用e返回其结点数据元素的值。

时间复杂度T(n)=0(n)

空间复杂度S(n)=O(l)

(13)ListTraverse(LinkListL,Status(*visit)(ElemTypea)

链表头指针L,指向调用函数的函数指针visit,依次对L的每个数据元素调用函数

visitOo一旦调用失败,则操作失败。

时间复杂度T(n)=O(n)

空间复杂度S(n)=O(l)

(14)ChooseList(LinkList*L,chars[],SqListLO)

单链表头指针地址,选择的单链表名s,用于管理单链表的顺序表L0,选择指定单链表。

时间复杂度T(n)=O(n)

空间复杂度S(n)=O(l)

(15)DeleteList(LinkList*L,chars[],SqListLO)

单链表头指针地址,选择的单链表名s,用于管理单链表的顺序表L0,删除指定单链表。

时间复杂度T(n)=O(n)

空间复杂度S(n)=

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论