数据结构课程设计 联系客服

发布时间 : 星期一 文章数据结构课程设计更新完毕开始阅读f2bbd7833b3567ec112d8ad5

开始开始用户输入值输入位置序号(用户或其他函数)对比下一个对比输入值与顺序表中元素NNO是否超出顺序表NOYES序号是否合法Y相等与否YES将该位置之后的元素都向前移一位,顺序表长度减一输出元素序号结束结束按值搜索元素序号流程图删除指定位置元素流程

其余函数是以上插入,删除和搜索函数的结合

5. 程序的主要函数及其伪代码说明 程序主要类:

templateclass seqlist

说明:这个顺序表包含了用户输入部分,也具有完整的输出,需要的数据是由用户输入的。

属性/参数/方法名 T *elems; int length; seqlist(void); void Display(void); void creat(void); void Getelem(void); void Insert(void); 4

功能 存储数据 存储顺序表长度 空构造函数 显示顺序表 创建顺序表(使用空构造函数后使用) 按位置读取元素 按位置插入元素 属性/参数/方法名 void Delete_elem_loc(void); void Seek (void); void Seek_repeat_elem(void); void Delete_firelem_num(void); void Delete_repete_elem(void); void Inverse(void); 主要函数的伪代码说明: seqlist::Getelem(i){ cin>> i;

if(i不在范围内) Return 错误信息; else{

输出this->elems[i-1]; return 取出成功;} }

seqlist::Insert(){ cin>>pos; cin>>data;

if(pos不在范围内) return 错误信息; else{

新建表Temp(this->length+=1); Temp[i]=elems[i];i

Temp[i]=elems[i-1];pos-1

将新的元素插入进新的表中; 删除原表;

用新表替换原表; return 插入成功;} }

seqlist::Delet_elem_loc(){ cin>>pos

if(pos不在范围内) return 错误信息; else{

elems[i]=elems[i+1];pos-1

seqlist::Seek(){ cin>>value;

for( i 遍历整张表)

if( elems[i] == value ){ return i 查找成功;}

5

功能 按位置删除元素 查找第一个等于给定值的元素 查找重复元素 删除第一个给定值元素 删除重复元素 逆置顺序表 else return 查找失败; }

seqlist::searchAll(){

建立存储序号的数组a[this->length]; bool flag=0;

for(i 遍历整张表)

if( elems[i] == value ){ a[i]=i;flag=1;} else a[i]=-1; if(falg==0)

Return 查找失败; Else

return []a 查找成功; }

seqlist::Inserve(){ T temp; for(int i=0;i

其他的函数都是在以上几个函数的基础上进行操作和输入输出,不再赘述。

6. 合作人设计分工

独立完成

三、 上机结果及体会

1. 合作人编码分工

本程序由本人独立完成

2. 实际完成的情况说明(完成的功能,支持的数据类型等)

题目中要求的功能均已实现。

测试阶段支持的数据类型为int整型。

后续使用中也可支持中<<操作支持的所有类型,但需要在源程序代码中更改数据类型。

3. 程序的性能分析,包括时空分析

1) 插入:移动数据的时间和顺序表大小成正比,时间复杂度为O(n);因使用了新的表代替旧表的操作空间复杂度为O(n);

2) 按位置删除一个值:时间复杂度为O(n);因是在原表进行数据移动,没有

使用辅助空间,空间复杂度为0;

3) 搜索等于定值的第一个元素序号:只遍历表一遍,表是无序的,平均查找

长度ASL =(n+1)/2;时间复杂度为O(n);没有使用辅助空间,空间复杂度为0;

6

4) 搜索等于定值的所有元素序号:由于只遍历表一遍,而且表是无序的,平

均查找长度ASL = n+1;时间复杂度为O(n);新建了保存序号的辅助数组,空间复杂度为O(n);

5) 按值删除第一个元素:搜索时间复杂度为O(n),删除时间复杂度为O(n),

空间复杂度为0——时间复杂度为O(n);空间复杂为0;

6) 按值删除所有重复元素:搜索时间复杂度为O(n),删除时间复杂度为O(n)——时间复杂度为O(n);使用了保存序号的辅助数组,空间复杂为O(n); 7) 逆置:移动数据的时间和顺序表大小成正比,时间复杂度为O(n);每次循环中使用了一个对象临时保存数据,空间复杂度为O(1);

8) 显示:每个元素显示序号和数据,时间是和顺序表大小成正比,时间复杂

度为O(n);空间复杂度为0;

4. 打印程序运行时的初值和运行结果,画出相应的图示(附录1) 5. 上机过程中出现的问题及其解决方案

1) 若输入过程中(比如在输入n个数据时,输入了n+1个数据)iostream

中的cin会将多余的一个数据保留在下次输入。解决方法:使用cin.sync()函数可以将空间中多余的输入数据清空。

2) 测试阶段设置的数据类型为int整型,若在某一步输入了int型之外的

数据,程序会进入死循环报错。解决方法:每次输入前提示用户输入int型数据(囧)。

6. 程序中可以改进的地方说明

在seqlist类中的操作函数,并不是让用户输入数据再传参进去的,而是在各个操作函数中提示用户输入数据。临近写完才发现这个问题,之后注意这个问题。 7. 程序中可以扩充的功能及设计实现假想

由用户选择需测试的数据。假想:在主程序中另套一层循环,由用户选择输入的数据类型,不同选择对应不同seqlistA; 8. 收获及体会

这次的课程设计的题目难度不大,主要是我们熟悉顺序表的各个操作。顺利完成了设计,经过几次修改,对于顺序表的操作基本没有问题。同时,我也发现自己在编程方面还存在诸多问题,对于问题思考不全面,水平还需提高。 9. 打印一份源程序清单并附上注释(附录2)

四、 参考文献

《数据结构—C++实现》(第二版)—缪淮扣、沈俊、顾训穰编著—科学出版社;

五、 附录

附录一:

7