华中科技大学·计算机13级·数据结构实验报告
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
return ERROR; return OK; }// DestroyList
1.3.3 ClearList 功能 与 DestroyList 不同,ClearList 并不直接对物理结构进行操作,而是修改其逻 辑长度值:
status ClearList(SqList * L){ //初始条件:线性表 L 已存在 //操作结果:将 L 重置为空表 if(L->elem == NULL) return ERROR; L->length = 0; return OK;
3
return ERROR; else{
assignEle(e, L.elem[i-1]); return OK; } }
1.3.7 LocatElem 功能 获取指定元素编号。函数的参数为:头结点、目标元素、名为 compare 的函 数指针。采用顺序比较法从表头遍历并比较,一旦找到,返回编号 i。最极端的 情况为目标元素位于目标顺序链的末端,此时函数的时间复杂度为 O(n)。
{
Elemtype
*newbase
=
(Elemtype
(L->listsize+LISTINCREMENT)*sizeof(Elemtype));
if(!newbase)
exit(OVERFLOW);
L->elem = newbase;
L->listsize += LISTINCREMENT;
}//考虑当前存储空间已满,则增加分配
}
1.3.5 ListLenth 功能 求表长。由于表长信息是 SqList 结构的成员之一,其值可以直接获得。
int ListLength(SqList L){ //初始条件:线性表 L 已存在 //操作结果:返回 L 中数据元素个数 if(L.elem == NULL) return ERROR; return L.length;
4
否则操作失败,next_e 无定义 if(L.elem==NULL) return ERROR; int i=LocatElem(L, cur, equal); //查询 cur 的位序 if(i==L.length && i==0) return ERROR; else{ assignEle(next_e,L.elem[i]); return OK; }
1.3.系统实现
1
1.3.0 ResetSqList 功能 SqList 的方法,将顺序表初始化。
void ResetSqList(SqList * L) {
//重置顺序表 L->elem = NULL; L->length = 0; L->listsize = 0; }
1.3.1 InitialList 功能 初始化线性表,传入的是头结点地址。申请一个大小为 LIST_INT_SIZE、类型 为 Elemtype 的线性存储空间,并用头结点中的首结点指针指向该空间首地址。 如果头结点地址已存在则寻问是否进行覆盖操作,若输入“666”则用新地址覆 写原地址。具体实现如下:
/*------------------------------------------------------*/ #define LIST_INIT_SIZE 100 // 线性表存储空间的初始分配量 #define LISTINCREMENT 10 // 线性表存储空间的分配增量
#define FILE_SAVE_PATH ".\\SqList.txt" //表示数据文件在同级目录下的 SqList.txt 中
1.3.11 ListDelete 功能 删除指定编号的数据元素,传入头结点地址、编号 i、表结点类型结构体地 址来返回被删除元素内容。执行前先判断传入的编号是否在可寻找范围内。执行
删除操作之后,进行“移位”运算。时间复杂度仍为 O(n)。如下:
status ListDelete(SqList * L,int i,Elemtype * e){ //初始条件:线性表 L 已存在且非空,1<=i<=L->length //操作结果:删除 L 的第 i 个数据元素,并用 e 返回其值,L 的长度减 1
status DestroyList(SqList * L){ //初始条件:线性表 L 已存在 //操作结果:销毁线性表 L
if(L->elem != NULL)
{ free(L->elem); //释放 L->elem 的内存空间
2
ResetSqList(L); //重置 L 中参数 } else
课程设计报告
课程名称:
数据结构
专业班级: CS1308 学 号: U201315009 姓 名: 陈劲龙 指导教师: 周时阳 报告日期: 2015-4-17
计算机科学与技术
目录
实验一 基于顺序结构的线性表实现 1.1 问题描述 1.2 系统设计 1.3.系统实现 1.4 效率分析
实验二 基于链式结构的线性表实现 2.1 问题描述 2.2 系统设计 2.3 系统实现 2.4 效率分析
}1.3.4 ListEmpty 功能 判空功能,判断表是否为空表。通过判断顺序表的逻辑长度可轻松判断顺序 表是否为空。实现如下:
status ListEmpty(SqList L){ //初始条件:线性表 L 已存在 //操作结果:若 L 为空表,则返回 TRUE,否则返回 FALSE if(L.elem == NULL) return ERROR; if(0 == L.length) return TRUE; //L 已经是空表 else return FALSE;
求指定元素的前一个元素的内容,传入头结点值、包含指定元素信息的一个
临时表结点值、存储前一个元素的表结点地址。主要思路是先调用 LocatElem 确
定指定元素的位置,如果不是首结点则可直接取到 PriorElem 的地址。时间复杂
度为 O(n)。具体实现如下:
status PriorElem(SqList L,Elemtype cur,Elemtype * pre_e){ //初始条件:线性表 L 已存在 //操作结果:若 cur 是 L 的数据元素,且不是第一个,则用 pre_e 返回它的前驱,
scanf("%d",&op);
{
if(666==op)
DestroyList(L);
else
return ERROR;
}Leabharlann Baidu
}
L->elem = (Elemtype *)malloc(LIST_INIT_SIZE*sizeof(Elemtype));
if(!L->elem)
exit(OVERFLOW);
//存储分配失败
L->length = 0;
//空表长度为 0
L->listsize = LIST_INIT_SIZE; //初始存储容量
return OK;
}// IntiaList
1.3.2 DestroyList 功能
销毁头结点中首结点址针指向的线性存储空间,传入的是头结点地址。具体 实现如下:
//
若这样的数据元素不存在,则返回值为 0
if(L.elem==NULL)
return ERROR;
int i;
for(i=L.length ; i>0 ; i--)
{
if(compare(e,L.elem[i-1]))
return i;
}
return --i; //不存在则返回 0
}
1.3.8 PriorElem 功能
status ListInsert(SqList * L,int i,Elemtype e){
//在顺序线性表 L 中第 i 个位置之前插入新的元素 e
//i 的合法值为 1<=i<=L.length+1
if(i<1 || i>L->length+1)
return ERROR; //i 值不合法
if(L->length >= L->listsize)
}
1.3.9 NextElem 功能
与 PriorElem 功能类似,不再赘述。其代码为:
status NextElem(SqList L,Elemtype cur,Elemtype * next_e){ //初始条件:线性表 L 已存在 //操作结果:若 cur 是 L 的数据元素,且不是最后一个,则用 next_e 返回它的后继,
6. GetElem
13. SwitchList
7. LocatElem
0. Exit
1.2.2 物理结构为顺序存储结构,数据元素为包含一个整型变量 item1 的结构
体:
typedef struct{ int item1;
}Elemtype;
typedef struct{ Elemtype * elem; int length; int listsize;
否则操作失败,pre_e 无定义 if(L.elem==NULL) return ERROR; int i=LocatElem(L, cur, equal); //查询 cur 的位序 if(i<=1) return ERROR; else{ assignEle(pre_e,L.elem[i-2]); return OK; }
}SqList;
1.2.3 构建线性表之前先声明一个头结点,用于存储该表的基本信息和首结点 地址:
SqList L1, L2;
1.2.4 本系统使用了如下预定义常量:
#define TRUE 1 #define FALSE 0 #define OK 2 #define ERROR -1 #define OVERFLOW -2 typedef int status; // Status 是函数的类型,其值是函数结果状态代码
int LocatElem(SqList L,Elemtype e,status (* compare)(Elemtype ,Elemtype )){
//初始条件:线性表 L 已存在,equal()是数据元素判定函数
//操作结果:返回 L 中第 1 个与 e 满足关系 equal()的数据元素的位序。
*)realloc(L->elem,
Elemtype *insert = &(L->elem[i-1]); Elemtype *cur=&(L->elem[L->length-1]); for( ; cur>=insert ; cur--) {
*(cur+1) = *cur; }//插入位置之后的元素依次后移 *insert = e; ++L->length; return OK; }
}
1.3.10 ListInsert 功能 插入一个数据元素,函数的参数为:头结点地址、插入位置 i、待插入结点。 函数的流程为:判断插入位置是否合理,再判断是否“满载”。如果满载则重新
申请更大的存储空间。接下来正式插入数据元素,“先空位置再插入”考虑极端
情况下,元素插在顺序表的开始位置,则时间复杂度为 n+c ,即 O(n)。
status IntiaList(SqList * L) {
//构建一个新的线性表 L if(L->elem!=NULL) {
int op;
printf("--------%40s--------\n","Warning: 当前顺序表已存在,确定覆盖?");
printf("--------%40s--------\n","ps: 输入'666'确定覆盖,否则退出");
}
1.3.6 GetElem 功能 获取第 i 号元素,传入的是头结点值、元素编号 i、以及用于传递得到的元 素的值的变量的地址。
status GetElem(SqList L,int i,Elemtype * e){ //初始条件:线性表 L 已存在,1<=i<=L.length //操作结果:用 e 返回 L 中第 i 个数据元素的值 if(L.elem==NULL || 1>i || L.length<i)
1.2 系统设计
1.2.1 提供 14 个功能,分别是:
1. IntiaList
8. PriorElem
2. DestroyList
9. NextElem
3. ClearList
10. ListInsert
4. ListEmpty
11. ListDelete
5. ListLength
12. ListTrabverse
实验三 基于二叉链表的二叉树实现 3.1 问题描述 3.2 系统设计 3.3 系统实现 3.4 效率分析
四 实验总结与评价
1 1 1 1 10 11 11 11 11 16 20
错误!未定义书签。 错误!未定义书签。 错误!未定义书签。
20 20
实验一 基于顺序结构的线性表实现
1.1 问题描述
基于顺序存储结构,实现线性表的基本的、常见的运算。
1.3.3 ClearList 功能 与 DestroyList 不同,ClearList 并不直接对物理结构进行操作,而是修改其逻 辑长度值:
status ClearList(SqList * L){ //初始条件:线性表 L 已存在 //操作结果:将 L 重置为空表 if(L->elem == NULL) return ERROR; L->length = 0; return OK;
3
return ERROR; else{
assignEle(e, L.elem[i-1]); return OK; } }
1.3.7 LocatElem 功能 获取指定元素编号。函数的参数为:头结点、目标元素、名为 compare 的函 数指针。采用顺序比较法从表头遍历并比较,一旦找到,返回编号 i。最极端的 情况为目标元素位于目标顺序链的末端,此时函数的时间复杂度为 O(n)。
{
Elemtype
*newbase
=
(Elemtype
(L->listsize+LISTINCREMENT)*sizeof(Elemtype));
if(!newbase)
exit(OVERFLOW);
L->elem = newbase;
L->listsize += LISTINCREMENT;
}//考虑当前存储空间已满,则增加分配
}
1.3.5 ListLenth 功能 求表长。由于表长信息是 SqList 结构的成员之一,其值可以直接获得。
int ListLength(SqList L){ //初始条件:线性表 L 已存在 //操作结果:返回 L 中数据元素个数 if(L.elem == NULL) return ERROR; return L.length;
4
否则操作失败,next_e 无定义 if(L.elem==NULL) return ERROR; int i=LocatElem(L, cur, equal); //查询 cur 的位序 if(i==L.length && i==0) return ERROR; else{ assignEle(next_e,L.elem[i]); return OK; }
1.3.系统实现
1
1.3.0 ResetSqList 功能 SqList 的方法,将顺序表初始化。
void ResetSqList(SqList * L) {
//重置顺序表 L->elem = NULL; L->length = 0; L->listsize = 0; }
1.3.1 InitialList 功能 初始化线性表,传入的是头结点地址。申请一个大小为 LIST_INT_SIZE、类型 为 Elemtype 的线性存储空间,并用头结点中的首结点指针指向该空间首地址。 如果头结点地址已存在则寻问是否进行覆盖操作,若输入“666”则用新地址覆 写原地址。具体实现如下:
/*------------------------------------------------------*/ #define LIST_INIT_SIZE 100 // 线性表存储空间的初始分配量 #define LISTINCREMENT 10 // 线性表存储空间的分配增量
#define FILE_SAVE_PATH ".\\SqList.txt" //表示数据文件在同级目录下的 SqList.txt 中
1.3.11 ListDelete 功能 删除指定编号的数据元素,传入头结点地址、编号 i、表结点类型结构体地 址来返回被删除元素内容。执行前先判断传入的编号是否在可寻找范围内。执行
删除操作之后,进行“移位”运算。时间复杂度仍为 O(n)。如下:
status ListDelete(SqList * L,int i,Elemtype * e){ //初始条件:线性表 L 已存在且非空,1<=i<=L->length //操作结果:删除 L 的第 i 个数据元素,并用 e 返回其值,L 的长度减 1
status DestroyList(SqList * L){ //初始条件:线性表 L 已存在 //操作结果:销毁线性表 L
if(L->elem != NULL)
{ free(L->elem); //释放 L->elem 的内存空间
2
ResetSqList(L); //重置 L 中参数 } else
课程设计报告
课程名称:
数据结构
专业班级: CS1308 学 号: U201315009 姓 名: 陈劲龙 指导教师: 周时阳 报告日期: 2015-4-17
计算机科学与技术
目录
实验一 基于顺序结构的线性表实现 1.1 问题描述 1.2 系统设计 1.3.系统实现 1.4 效率分析
实验二 基于链式结构的线性表实现 2.1 问题描述 2.2 系统设计 2.3 系统实现 2.4 效率分析
}1.3.4 ListEmpty 功能 判空功能,判断表是否为空表。通过判断顺序表的逻辑长度可轻松判断顺序 表是否为空。实现如下:
status ListEmpty(SqList L){ //初始条件:线性表 L 已存在 //操作结果:若 L 为空表,则返回 TRUE,否则返回 FALSE if(L.elem == NULL) return ERROR; if(0 == L.length) return TRUE; //L 已经是空表 else return FALSE;
求指定元素的前一个元素的内容,传入头结点值、包含指定元素信息的一个
临时表结点值、存储前一个元素的表结点地址。主要思路是先调用 LocatElem 确
定指定元素的位置,如果不是首结点则可直接取到 PriorElem 的地址。时间复杂
度为 O(n)。具体实现如下:
status PriorElem(SqList L,Elemtype cur,Elemtype * pre_e){ //初始条件:线性表 L 已存在 //操作结果:若 cur 是 L 的数据元素,且不是第一个,则用 pre_e 返回它的前驱,
scanf("%d",&op);
{
if(666==op)
DestroyList(L);
else
return ERROR;
}Leabharlann Baidu
}
L->elem = (Elemtype *)malloc(LIST_INIT_SIZE*sizeof(Elemtype));
if(!L->elem)
exit(OVERFLOW);
//存储分配失败
L->length = 0;
//空表长度为 0
L->listsize = LIST_INIT_SIZE; //初始存储容量
return OK;
}// IntiaList
1.3.2 DestroyList 功能
销毁头结点中首结点址针指向的线性存储空间,传入的是头结点地址。具体 实现如下:
//
若这样的数据元素不存在,则返回值为 0
if(L.elem==NULL)
return ERROR;
int i;
for(i=L.length ; i>0 ; i--)
{
if(compare(e,L.elem[i-1]))
return i;
}
return --i; //不存在则返回 0
}
1.3.8 PriorElem 功能
status ListInsert(SqList * L,int i,Elemtype e){
//在顺序线性表 L 中第 i 个位置之前插入新的元素 e
//i 的合法值为 1<=i<=L.length+1
if(i<1 || i>L->length+1)
return ERROR; //i 值不合法
if(L->length >= L->listsize)
}
1.3.9 NextElem 功能
与 PriorElem 功能类似,不再赘述。其代码为:
status NextElem(SqList L,Elemtype cur,Elemtype * next_e){ //初始条件:线性表 L 已存在 //操作结果:若 cur 是 L 的数据元素,且不是最后一个,则用 next_e 返回它的后继,
6. GetElem
13. SwitchList
7. LocatElem
0. Exit
1.2.2 物理结构为顺序存储结构,数据元素为包含一个整型变量 item1 的结构
体:
typedef struct{ int item1;
}Elemtype;
typedef struct{ Elemtype * elem; int length; int listsize;
否则操作失败,pre_e 无定义 if(L.elem==NULL) return ERROR; int i=LocatElem(L, cur, equal); //查询 cur 的位序 if(i<=1) return ERROR; else{ assignEle(pre_e,L.elem[i-2]); return OK; }
}SqList;
1.2.3 构建线性表之前先声明一个头结点,用于存储该表的基本信息和首结点 地址:
SqList L1, L2;
1.2.4 本系统使用了如下预定义常量:
#define TRUE 1 #define FALSE 0 #define OK 2 #define ERROR -1 #define OVERFLOW -2 typedef int status; // Status 是函数的类型,其值是函数结果状态代码
int LocatElem(SqList L,Elemtype e,status (* compare)(Elemtype ,Elemtype )){
//初始条件:线性表 L 已存在,equal()是数据元素判定函数
//操作结果:返回 L 中第 1 个与 e 满足关系 equal()的数据元素的位序。
*)realloc(L->elem,
Elemtype *insert = &(L->elem[i-1]); Elemtype *cur=&(L->elem[L->length-1]); for( ; cur>=insert ; cur--) {
*(cur+1) = *cur; }//插入位置之后的元素依次后移 *insert = e; ++L->length; return OK; }
}
1.3.10 ListInsert 功能 插入一个数据元素,函数的参数为:头结点地址、插入位置 i、待插入结点。 函数的流程为:判断插入位置是否合理,再判断是否“满载”。如果满载则重新
申请更大的存储空间。接下来正式插入数据元素,“先空位置再插入”考虑极端
情况下,元素插在顺序表的开始位置,则时间复杂度为 n+c ,即 O(n)。
status IntiaList(SqList * L) {
//构建一个新的线性表 L if(L->elem!=NULL) {
int op;
printf("--------%40s--------\n","Warning: 当前顺序表已存在,确定覆盖?");
printf("--------%40s--------\n","ps: 输入'666'确定覆盖,否则退出");
}
1.3.6 GetElem 功能 获取第 i 号元素,传入的是头结点值、元素编号 i、以及用于传递得到的元 素的值的变量的地址。
status GetElem(SqList L,int i,Elemtype * e){ //初始条件:线性表 L 已存在,1<=i<=L.length //操作结果:用 e 返回 L 中第 i 个数据元素的值 if(L.elem==NULL || 1>i || L.length<i)
1.2 系统设计
1.2.1 提供 14 个功能,分别是:
1. IntiaList
8. PriorElem
2. DestroyList
9. NextElem
3. ClearList
10. ListInsert
4. ListEmpty
11. ListDelete
5. ListLength
12. ListTrabverse
实验三 基于二叉链表的二叉树实现 3.1 问题描述 3.2 系统设计 3.3 系统实现 3.4 效率分析
四 实验总结与评价
1 1 1 1 10 11 11 11 11 16 20
错误!未定义书签。 错误!未定义书签。 错误!未定义书签。
20 20
实验一 基于顺序结构的线性表实现
1.1 问题描述
基于顺序存储结构,实现线性表的基本的、常见的运算。