实验一 线性表及其应用(I) 下载本文

内容发布更新时间 : 2025/1/23 12:44:09星期一 下面是文章的全部内容请认真阅读。

电子信息工程学院2013级《数据结构》实验报告

/*

* 函数原型:Status InsertSequentList_Sq(SqList &L, ElemType e);

* 函数功能:向已经过排序的线性表L中插入元素,插入位置由数据在线性表的大小关系确定 * 入口参数:结构体类型SqList的引用,待插入的数据 * 出口参数:返回函数结果状态 */

Status InsertSequentList_Sq(SqList &L, ElemType e) {

int i,j; //位序变量 ElemType *p, *q; //插入位置指针

ElemType *newbase; //动态存储分配新基址指针 if (L.length >= L.listsize) //当存储空间已满,增加分配 { }

if (L.elem[0] <= L.elem[1]) //判断此顺序表是否为递增 { } else {

for (i = 0; i < L.length; i++) //顺序查找 for (i = 0; i < L.length; i++) //顺序查找 { }

p = &(L.elem[j+1]); //指向满足上条件元素的后一个位置 for (q = &(L.elem[L.length - 1]); q >= p; --q) //将待插入元素位

*(q + 1) = *q;

*p = e; //插入元素 ++L.length; //表长自增

if (e >= L.elem[i]) //判断待插入元素是否大于当前位置元素

j = i; //保存当前元素位序

newbase = (ElemType *)realloc(L.elem, (L.listsize + if (!newbase) //分配失败,返回错误

return OVERFLOW;

L.elem = newbase; //将新的地址指针赋值,注:另定义一个指针变量L.listsize += LISTINCREMENT; //增加存储容量 { }

return OK;

temp = L.elem[i]; //缓存需要交换的数据

L.elem[i] = L.elem[L.length - 1 - i]; //对称位置数据交换 L.elem[L.length - 1 - i] = temp;

} //InverseList_Sq

LISTINCREMENT)*sizeof(ElemType)); //存储再分配

newbase,而不用L.elem,是因为防止存储分配失败,使原基址被覆盖

电子信息工程学院2013级《数据结构》实验报告

/*

* 函数原型:Status BubbleSortList_Sq(SqList &L,Status direction) * 函数功能:将已有数据的线性表L进行排序,排序方式由参数direction确定

* 入口参数:已建立顺序表的引用&L,排序方式direction,当direction = INC = 1时,为递增,反之则为递减

* 出口参数:返回函数结果状态 */

Status BubbleSortList_Sq(SqList &L,Status direction) {

int i,j; //循环控制变量 ElemType temp; //临时缓存变量 if (L.length == 0) { }

if (L.length == 1) {

for (i = L.length; i > 0; --i) //起泡法排序 {

for (j = 0; j < i - 1; j++) {

if (L.elem[j]>L.elem[j + 1]) //前一个元素大于后一个元素 {

temp = L.elem[j]; //保持较大的元素 if (direction) //排序方式为递增 {

L.elem[j] = L.elem[j + 1]; //交换 L.elem[j + 1] = temp;

return OK;

if (L.length >= 2) //表中元素至少多于2个

printf(\错误,当前线性表为空,请录入数据:\\n\); return ERROR; //线性表错误 }

return OK;

{ }

p = &(L.elem[j + 1]); //指向满足上条件元素的后一个位置

for (q = &(L.elem[L.length - 1]); q >= p; --q) //将待插入元素位置后的元

*(q + 1) = *q;

if (e <= L.elem[i]) //判断待插入元素是否小于当前位置元素

j = i; //保存当前元素位序

素依次后移一个位置

*p = e; //插入元素 ++L.length; //表长自增

} //InsertSequentList_Sq

电子信息工程学院2013级《数据结构》实验报告

} return OK; } } } else { } temp = L.elem[j]; //保持较小的元素 if (!direction) //排序方式为递减 { } L.elem[j] = L.elem[j + 1]; //交换 L.elem[j + 1] = temp; } } //BubbleSortList_Sq 运行结果 实验结果分析:从以上实验运行结果来说,程序可以实现实验要求的基本内容,至于数据输入等操作步骤从上图可以简单、明了的看出。 实验总结 1、此次实验遇到的问题是自己编写的头文件编译器打不开、出现类型重定义、枚举类型变量错误等,进而报出来很多的错误,经过长时间的仔细检查和搜索知道,需将头文件放到与源文件相同的目录下,而类型重定义则是少打了结构体类型名,至于枚举类型报错,则是因为枚举类型知识不牢靠,使用错误造成的,其他的错误则是函数编写逻辑错误等,但最终还是成功了,所以此次实验对我来说收货的很大的。 2、此次程序中需要改进和优化的地方还很多,其中困扰我的是每次输入数据的时候都需要先设置表长,但输入的时候每次都要数自己输入了多少个数,所以我就想怎样在不初始输入表长的条件下,由函数自己判断是否数据输入结束,开始我想到的是在for循环下输入数据,当数据输入结束的时候判断是否输入’\\n’或者输入一些自己定义的数据结束标志,例如’#’等,但是这种判断方法很容易出现误判断,进而出现一些莫名其妙的数据,所以这个输入数据的算法还没有想出了。 3、通过此次实验我学的的主要就是头文件的包含、typedef定义类型的方法、结构体类型的使用和指针的正确使用,总之这次实验对我的编程有很大的帮助。