一:作业内容
本周要求挑3道题目写设计思路、调试过程。设计思路用伪代码描述。题目选做要求:
- 顺序表选择一题(6-2,6-3,7-1选一题),代码必须用顺序结构抽象数据类型封装
- 单链表选择一题(6-1不能选)
- 有序表选择一题
选择的题:顺序表6-3(删除重复元素);
单链表6-2(单链表逆置);
有序表7-3(两个有序序列的中位数);
题目一:
1,题目名称: 6-3 jmu-ds- 顺序表删除重复元素(25 分)
设计一个算法,从顺序表中删除重复的元素,并使剩余元素间的相对次序保存不变。
2,伪代码:
定义变量i,j,作为判断循环的下标,k作为新形成的链表的下端
for i=0 to length(链表的长度)--外循环
k=0 (从零开始重新对链表每个元素赋值)
for j=i-1 to 0(内循环,判断i之内的数据是否有和data[k]相等的值)
k--(如果有相同的值,则k要减一,让下一个值覆盖它;
3,设计思路:
从第一个元素开始对链表重新赋值,若判断到第i个数据和前面某个数据相同,此时data[k]保留了这个与之前有相同的数据,则让k--;
这样下一次循环新赋进来的值覆盖了之前相同的值,而元素的物理位置不变,从而实现重复元素的删除
4,代码截图:
5,提交列表
错因分析:第一个是格式问题,忘记最后不能空格;
第二个是在第一个改好的基础上,没有考虑空表特殊情况的输出;
第三个是不小心少打了个符号,导致编译错误;
题目二
1,题目名称:6-2 jmu-ds-单链表逆置(25 分)
本题要求实现一个函数,将给定单向链表逆置,即表头置为表尾,表尾置为表头。链表为带头结点链表。链表结点定义如下
2,伪代码:
再定义一个链表L2,将L1中的数据给L2赋值,使用头插法;
3,设计思路 :
使用头插重新将原链表中的数据插入新链表中,最后将原链表的头指针指向新链表就好;
4,代码截图:
5,提交列表:
错误原因:没有考虑链表为空时的特殊情况;
题目三
1,题目名称:
7-3 两个有序序列的中位数(25 分)
已知有两个等长的非降序序列S1, S2, 设计函数求S1与S2并集的中位数。有序序列A0,A1,⋯,AN−1的中位数指A(N−1)/2的值,
即第⌊(N+1)/2⌋个数(A0为第1个数)。
2,伪代码:
定义三个数组s1,s2,s3;
从i=0 to n(数组的长度)
if(s1[i]<s2[i])则将 s1[i]赋值给s3[j++];
3,设计思路
新建一个链表将原链表中一次比较后更小的值一次赋进去;
4,代码截图
5,提交列表
错误原因:第一下用链表做,用C++语言,忘了加头文件;
第二下用字符串做,但对一些字符串函数的用法忘记,导致做错
二、截图本周题目集的PTA最后排名
本次2个题目集总分:290分
1,顺序表PTA排名
2,链表PTA排名
3,我的总分 2分
三、本周学习总结
1,这周对数据结构的安排时间是挑大段的时间去写代码,时间安排还好,但打代码效率低,有一些
不懂的没有即使问老师或同学,导致一些题目欠了好几天才完成;
2,线性表就使计算机中数据元素的能够线性存储; 实现线性存储有两种不同的方式:顺序表和链表,
两者最大的区别在于存储时数据元素的物理位置是否相邻;
3,代码Git提交记录截图