数据结构实验报告.docx

上传人:b****6 文档编号:8860442 上传时间:2023-02-02 格式:DOCX 页数:33 大小:34.29KB
下载 相关 举报
数据结构实验报告.docx_第1页
第1页 / 共33页
数据结构实验报告.docx_第2页
第2页 / 共33页
数据结构实验报告.docx_第3页
第3页 / 共33页
数据结构实验报告.docx_第4页
第4页 / 共33页
数据结构实验报告.docx_第5页
第5页 / 共33页
点击查看更多>>
下载资源
资源描述

数据结构实验报告.docx

《数据结构实验报告.docx》由会员分享,可在线阅读,更多相关《数据结构实验报告.docx(33页珍藏版)》请在冰豆网上搜索。

数据结构实验报告.docx

数据结构实验报告

课程实验报告

课程名称:

数据结构

指导教师:

报告日期:

2015.05.12

计算机科学与技术学院

目录

实验一基于顺序结构的线性表实现1

1.1问题描述1

1.2系统设计1

1.3.系统实现1

1.4效率分析9

实验二基于链式结构的线性表实现10

2.1问题描述10

2.2系统设计10

2.3系统实现10

2.4效率分析15

实验三基于二叉链表的二叉树实现16

3.1问题描述16

3.2系统设计16

3.3系统实现16

3.4效率分析27

四实验总结与评价27

实验一基于顺序结构的线性表实现

1.1问题描述

基于顺序存储结构,实现线性表的基本的、常见的运算。

1.2系统设计

1.2.1系统提供12个功能,分别是:

1.IntiaList(初始化)7.LocatElem(定位元素)

2.DestroyList(消除线性表)8.PriorElem(得到元素前驱)

3.ClearList(清空线性表)9.NextElem(得到元素后继)

4.ListEmpty(判断线性表是否为空)10.ListInsert(插入元素)

5.ListLength(求信息表中元素个数)11.ListDelete(删除某元素)

6.GetElem(得到表中元素)12.ListTrabverse(遍历线性表)

1.2.2物理结构为顺序存储结构,数据元素为包含一个整型变量的结构体,即:

typedefstruct

{

intitem1;

}Elemtype;

1.2.3构建线性表之前先声明一个头结点,用于存储该表的基本信息和首结点地址,即:

typedefstruct

{

intlength;

intlistsize;

Elemtypeelem[];

}SqList;

1.3.系统实现

1.3.1-IntiaList(初始化)

初始化线性表

先判断所选择的表是否存在,若不存在,那么为所选表分配LIST_INIT_SIZE大小的初始存贮空间,若存在,报错

若初始存储空间分配成功,再将头节点中包含的关于该表的信息做相应赋值

若初始存储空间分配不成功,则报错

C语言实现如下:

statusInitaList(SqList**selected_list){

if(*selected_list!

=NULL){

returnERROR;

}

*selected_list=(SqList*)malloc(sizeof(SqList)+sizeof(Elemtype)*LIST_INIT_SIZE);

if(*selected_list==NULL){

returnOVERFLOW;

}

(*selected_list)->length=0;

(*selected_list)->listsize=LIST_INIT_SIZE;

returnOK;

}

1.3.2DestroyList(销毁线性表)

判断所选表是否为空

为空,则报错,反之,继续下一步

释放所选表存储空间,并将头节点中包含改线性表的相关信息修改

C语言实现如下:

statusDestroyList(SqList**selected_list){

if(*selected_list==NULL){

returnERROR;

}

SqList*need_free=(*selected_list);

*selected_list=NULL;

free(need_free);

returnOK;

}

1.3.3ClearList(清空线性表)

判断所选表是否为空

为空,报错;反之,修改头节点中关于该表的信息,将元素数目置0

C语言实现如下:

statusClearList(SqList**selected_list){

if(*selected_list==NULL){

returnERROR;

}

(*selected_list)->length=0;

returnOK;

}

1.3.4ListEmpty(判断表是否为空)

判断所选表是否为空

为空,报错;反之,得到该表的元素数目,并存储数目值

C语言实现如下:

statusListLengthorEmpty(SqList**selected_list,int*answer){

if(*selected_list==NULL){

returnERROR;

}

*answer=(*selected_list)->length;

returnOK;

}

1.3.5ListLength(求信息表中元素个数)

实现过程同1.3.4

C语言实现如下:

statusListLengthorEmpty(SqList**selected_list,int*answer){

if(*selected_list==NULL){

returnERROR;

}

*answer=(*selected_list)->length;

returnOK;

}

1.3.6GetElem(得到表中元素)

判断所选表是否为空

为空,则报错;反之,判断位置参数INDEX是否在合理区间

不在合理区间,报错;反之,将该位置元素存贮在选定空间中

C语言实现如下:

statusGetElem(SqList**selected_list,intindex,Elemtype**answer){

if(*selected_list==NULL){

returnERROR;

}

if(index>(*selected_list)->length){

returnINFEASTABLE;

}

*answer=&((*selected_list)->elem[index]);

returnOK;

}

1.3.7.LocatElem(定位元素)

判断是否为空

为空,则报错;反之,用循环比较线性表中其他元素与所选元素

若元素存在,则将元素在线性表中位置存储在已知空间中

反之,将已知空间中值置为-1

C语言实现如下:

statusLocateElem(SqList**selected_list,Elemtype*value,int*answer,status(*compare)(constElemtype*x,constElemtype*y)){

if(*selected_list==NULL){

returnERROR;

}

inti=0;

intresult=ELEM_UNMATCH;

*answer=-1;

for(i=0;i<(*selected_list)->length;i++){

result=compare(&((*selected_list)->elem[i]),value);

if(result==ELEM_MATCH){

*answer=i;

break;

}

}

returnOK;

}

1.3.8PriorElem(得到元素前驱)

算法过程同1.3.7

找到匹配位置后只需根据以下情况处理:

若匹配位置为首元素后其他元素,则输出匹配位置前一个元素

若匹配位置为首元素,则表示所选元素为首元素

其他情况,报错

1.3.9NextElem(得到元素后继)

算法过程同1.3.7

找到匹配位置后只需根据以下情况处理:

若匹配位置为末元素后其他元素,则输出匹配位置后一个元素

若匹配位置为末元素,则表示所选元素为末元素

其他情况,报错

1.3.10.ListInsert(插入元素)

判断所选表是否为空,为空报错;反之,继续

判断线性表是否已满,是报错;反之,继续

判断所选位置是否在范围内,不在,报错;反之,继续

将插入位置的元素依次后移一个位置,将元素插入

修改头节点中关于该线性表的基本信息

C语言实现如下:

statusListInsert(SqList**selected_list,intindex,Elemtypevalue){

if(*selected_list==NULL){

returnERROR;

}

if((*selected_list)->length>=(*selected_list)->listsize){

returnOVERFLOW;

}

if(index>(*selected_list)->length){

returnINFEASTABLE;

}

inti;

for(i=(*selected_list)->length;i>index;i--){

(*selected_list)->elem[i]=(*selected_list)->elem[i-1];

}

(*selected_list)->elem[index].item1=value;

((*selected_list)->length)++;

returnOK;

}

1.3.11ListDelete(删除某元素)

判断所选表是否为空,为空报错;反之,继续

判断所选位置是否在范围内,不在,报错;反之,继续

将所选位置的元素存储在给定空间中

将删除位置后的元素依次前移一个位置

修改头节点中关于该线性表的基本信息

C语言实现:

statusListDelete(SqList**selected_list,intindex,Elemtype**answer){

if(*selected_list==NULL){

returnERROR;

}

if(index>=(*selected_list)->length){

returnINFEASTABLE;

}

*answer=(Elemtype*)malloc(sizeof(Elemtype));

(*answer)->item1=(*selected_list)->elem[index].item1;

inti;

for(i=index;i<(*selected_list)->length-1;i++){

(*selected_list)->elem[i]=(*selected_list)->elem[i+1];

}

((*selected_list)->length)--;

returnOK;

}

1.3.12ListTrabverse(遍历线性表)

判断所选表是否为空,为空,则报错;反之,继续

判断所选表是否有元素,无,则报空;反之,继续

采用循环,调用visit的函数遍历线性表,且输出

C语言实现:

statusListTrabverse(SqList**selected_list,status(*visit)(Elemtype*elem)){

if(*selected_list==NULL){

returnERROR;

}

inti;

if(!

(*selected_list)->length)return(0);

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

for(i=0;i<(*selected_list)->length;i++)visit((*selected_list)->elem[i]);

return

(1);

}

1.4效率分析

1.IntiaList(初始化)7.LocatElem(定位元素)

2.DestroyList(消除线性表)8.PriorElem(得到元素前驱)

3.ClearList(清空线性表)9.NextElem(得到元素后继)

4.ListEmpty(判断线性表是否为空)10.ListInsert(插入元素)

5.ListLength(求信息表中元素个数)11.ListDelete(删除某元素)

6.GetElem(得到表中元素)12.ListTrabverse(遍历线性表)

时间复杂度分析:

InitaList、DestroyList、ClearList、ListEmpty、ListLength由于采取的操作为主要对头节点进行,故时间复杂度为O

(1);

GetElem、LocatElem、PriorElem、NextElem、ListInsert、ListDelete、ListTrabverse由于采取的操作均需将线性表遍历,故时间复杂度为O(n);

 

实验二基于链式结构的线性表实现

2.1问题描述

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

2.2系统设计

2.2.1.系统提供12个功能

1.IntiaList(初始化)7.LocatElem(定位元素)

2.DestroyList(消除线性表)8.PriorElem(得到元素前驱)

3.ClearList(清空线性表)9.NextElem(得到元素后继)

4.ListEmpty(判断线性表是否为空)10.ListInsert(插入元素)

5.ListLength(求信息表中元素个数)11.ListDelete(删除某元素)

6.GetElem(得到表中元素)12.ListTrabverse(遍历线性表)

2.2.2物理结构为链式结构,包含一个数据元素和一个指针

typedefstruct

{

intitem1;

structelemtype*next;

}Elemtype;

2.2.3构建线性表之前先声明一个头结点

typedefstruct

{

intlength;

Elemtype*elem;

}SqList;

2.3.系统实现

2.3.1-IntiaList(初始化)

判读指向所选表指针是否为空,为空,则报错;反之,进行下一步

为该指针分配指向空间

分配失败,则报错

分配成功,则修改头节点中length信息,并确认初始指向为空

C语言实现如下:

statusInitaList(SqList**selected_list){

if(*selected_list!

=NULL){

returnERROR;

}

*selected_list=(SqList*)malloc(sizeof(SqList));

if(*selected_list==NULL){

returnOVERFLOW;

}

(*selected_list)->length=0;

(*selected_list)->elem=NULL;

returnOK;

}

2.3.2DestroyList(销毁线性表)

判断所选链表是否为空,为空,则报错;反之,进行下一步

用循环依次释放链表元素所占空间,最后释放指向表头的链表所指向空间并赋空

C语言实现如下:

statusDestroyList(SqList**selected_list){

if(*selected_list==NULL){

returnERROR;

}

SqList*need_free=(*selected_list);

Elemtype**elem_itor=&((*selected_list)->elem);

while(*elem_itor){

DestroyElem(elem_itor);

}

*selected_list=NULL;

free(need_free);

returnOK;

}

statusDestroyElem(Elemtype**elem){

if(*elem==NULL){

returnERROR;

}

Elemtype*need_free=*elem;

*elem=need_free->next;

free(need_free);

need_free=NULL;

returnOK;

}

2.3.3ClearList(清空线性表)

判断所选链表是否为空,为空,则报错;反之,进行下一步

将链表销毁后再初始化

C语言实现如下:

statusClearList(SqList**selected_list){

if(*selected_list==NULL){

returnERROR;

}

if(DestroyList(selected_list)==1&&

InitaList(selected_list)==1){

returnOK;

}else{

returnERROR;

}

}

2.3.4ListEmpty(判断表是否为空)

判断所选链表是否为空,为空,则报错;反之,进行下一步

获取链表中关于元素数目的值并存放在指定空间内

C语言实现如下:

statusListLengthorEmpty(SqList**selected_list,int*answer){

if(*selected_list==NULL){

returnERROR;

}

*answer=(*selected_list)->length;

returnOK;

}

2.3.5ListLength(求信息表中元素个数)

同1.3.4

2.3.6GetElem(得到表中元素)

判断所选链表是否为空,为空,则报错;反之,进行下一步

判断指定位置INDEX是否合理,不合理,则报错;合理,进行下一步

利用循环的读取指定位置元素,并将指定位置元素存放在指定空间里

C语言实现如下:

statusGetElem(SqList**selected_list,intindex,Elemtype**answer){

if(*selected_list==NULL){

returnERROR;

}

if(index>=(*selected_list)->length){

returnINFEASTABLE;

}

intdepth=(*selected_list)->length-1-index;

inti=0;

Elemtype**elem_itor=&((*selected_list)->elem);

for(i=0;i

elem_itor=&((*elem_itor)->next);

}

*answer=*elem_itor;

returnOK;

}

2.3.7.LocatElem(定位元素)

判断所选链表是否为空,为空,则报错;反之,进行下一步

采用循环遍历整个链表,在该过程中将元素与所选元素进行比较

若满足条件则将位置值赋给指定元素

若不满足条件则将-1赋给指定元素

C语言实现如下:

statusLocateElem(SqList**selected_list,Elemtype*value,int*answer,status(*compare)(constElemtype*x,constElemtype*y)){

if(*selected_list==NULL){

returnERROR;

}

inti=0;

intresult=ELEM_UNMATCH;

intdepth=-1;

Elemtype**elem_itor=&((*selected_list)->elem);

while(*elem_itor){

result=compare(*elem_itor,value);

if(result==ELEM_MATCH){

depth=i;

break;

}

i++;

elem_itor=&((*elem_itor)->next);

}

if(depth==-1){

*answer=-1;

}else{

*answer=(*selected_list)->length-1-depth;

}

returnOK;

}

2.3.8PriorElem(得到元素前驱)

算法过程同1.3.7

找到匹配位置后只需根据以下情况处理:

若匹配位置为首元素后其他元素,则输出匹配位置前一个元素

若匹配位置为首元素,则表示所选元素为首元素

其他情况,报错

2.3.9NextElem(得到元素后继)

算法过程同1.3.7

找到匹配位置后只需根据以下情况处理:

若匹配位置为末元素后其他元素,则输出匹配位置后一个元素

若匹配位置为末元素,则表示所选元素为末元素

其他情况,报错

2.3.10.ListInsert(插入元素)

判断所选链表是否为空,为空,则报错;反之,进行下一步

判断指定位置INDEX是否合理,不合理,则报错;反之,进行下一步

为新元素分配节点,修改指定位置、与其后节点及新节点的指针之间的指向关系

修改该头节点中包含的关于线性表元素数目的信息

C语言实现如下:

statusInsertList(SqList**selected_list,intindex,intvalue){

if(*selected_list==NULL){

returnERROR;

}

if(index>(*selected_list)->length){

returnINFEASTABLE;

}

intdepth=(*selected_list)->length-index;

inti=0;

Elemtype**elem_itor=&((*selected_list)->elem);

for(i=0;i

elem_itor=&((*elem_itor)->next);

}

Elemtype*tmp=(Elemtype*)malloc(sizeof(Elemtype));

tmp->item1=value;

tmp->next=*elem_itor;

*elem_itor=tmp;

((*selected_list)->length)++;

returnOK;

}

2.3.11ListDelete(删除某元素)

判断所选链表是否为空,为空,则报错;反之,进行下一步

判断指定位置是否合理,不合理,则报错;反之,进行下一步

得到指定位置前驱元素的指针,修改指针指向关

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

当前位置:首页 > 职业教育 > 职业技术培训

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

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