数据结构实验报告.docx
《数据结构实验报告.docx》由会员分享,可在线阅读,更多相关《数据结构实验报告.docx(33页珍藏版)》请在冰豆网上搜索。
数据结构实验报告
课程实验报告
课程名称:
数据结构
指导教师:
报告日期:
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;ielem_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;ielem_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(删除某元素)
判断所选链表是否为空,为空,则报错;反之,进行下一步
判断指定位置是否合理,不合理,则报错;反之,进行下一步
得到指定位置前驱元素的指针,修改指针指向关