DS博客作业02--线性表

1.本周学习总结

1.1思维导图

1.2.谈谈你对线性表的认识及学习体会。

首先,讲一下对本次学习的总体感受为:基础知识偏基础,应用上也较直接,总体上还行。顺序存储结构中的链表和链式存储结构中的单链表,上个学期学习c语言时已经学习和应用过了,所以基础知识的导入还是比较和蔼可亲的。之后就是结合数据结构新的内容,会比原来的数组、链表更注重于对数据的处理,尤其是对数据的基本操作,采用多个函数来完成,解决问题的分模块思想更加明确,将大问题分解为小问题。还有就是学会了根据数据的特点运用合适的存储结构,存储结构各有特点,学会针对数据类型,采用合适的存储结构,可以在后面的操作中,方便很多,很有帮助。再有就是对上一章算法时间复杂度和空间复杂度的计算,在课堂派的作业中也有体现。

2.PTA实验作业

2.1.题目1:题目名称

6-4 顺序表操作集 (20 分)

List MakeEmpty():创建并返回一个空的线性表;
Position Find( List L, ElementType X ):返回线性表中X的位置。若找不到则返回ERROR;
bool Insert( List L, ElementType X, Position P ):将X插入在位置P并返回true。若空间已满,则打印“FULL”并返回false;如果参数P指向非法位置,则打印“ILLEGAL POSITION”并返回false;
bool Delete( List L, Position P ):将位置P的元素删除并返回true。若参数P指向非法位置,则打印“POSITION P EMPTY”(其中P是参数值)并返回false。

2.1.1设计思路(伪代码)

思路(仅讨论Insert函数和Delete函数):
Insert函数:先判断是否空间满或者非法,若可插入,则用数组插入的方法插入,返回true;否则,返回false。
Delete函数:先判断是否非法,若非法,返回false;否则,用数组方法删除,返回true。

伪代码:Insert函数:

形参:L为顺序表,X为待插入的值,P为插入位置
定义整型i用来遍历L
if L->Last+1==MAXSIZE then       //判断是否空间已满
    输出“FULL”
    返回false
end if
if P>L->Last+1||P<0  then             //判断是否非法
    输出“ILLEGAL POSITION”
    返回false
end if
for L->Last to P do
    另i+1位置的值等于i位置的值    //向后挪动数组
end for
L->Last增大1                                //增大实际长度
在P位置插入
返回true

Delete函数:

形参:L为顺序表,P为要删除的位置
定义整型变量j用来遍历顺序表L
if P>L->Last||P<0 then                 //判断是否非法
    输出"POSITION P EMPTY"
    放回false
end if
for j=P to L->Last do                    //向前挪动数组完成删除操作
    另j处的值等于j+1处的值
end for
L的实际长度要减少1
返回true

2.1.2代码截图

2.1.3本题PTA提交列表说明。

  • Q1:第一次的编译错误是在本题中错使用了C++的语法导致的。
  • Q2:中间的一串12分让我脑阔疼了好久,测试数据都莫得错......自己也搞了好几个数据,貌似也是对的。这题的问题在于有些边界条件太模糊了,一直找不到问题原因。后来研究了正确代码,发现了罪魁祸首:
    这两个非法的判断条件居然有那么一丢丢的不同!emmmm脑阔疼。

2.2 题目2:题目名称

6-9 jmu-ds-有序链表合并 (20 分)

已知两个递增链表序列L1与L2,2个链表都是带头结点链表。设计函数实现L1,L2的合并,合并的链表仍然递增有序,头结点为L1的头结点。 合并后需要去除重复元素
void MergeList(LinkList &L1,LinkList L2)//合并链表

2.2.1设计思路(伪代码)

思路:新建L3头结点,利用L1、L2递增的特性,同时遍历L1L2直至一方结束,从小到大,把结点插到L3后面。其中一个链到达链尾后,将L3与未到链尾的链表剩下的指针对接。

伪代码:

形参:L1、L2为待合并链表
定义链表结点指针p遍历L1用、q遍历L2用、L3、s遍历L3用、node插入时的中继指针
p指向L1的首个有效结点,q指向L2的首个有效结点,创建L3头节点,并让s指向它
while p&&q do
    if p结点值大于q结点值
        在L3链表后面插入q
        q向后挪
    else if p结点值小于q结点值
        在L3链表后面插入p
        p向后挪
    else p结点值等于q结点值
        在L3链表后面插入p
        p和q同时向后挪

    end if
end while
if 未到达L1链尾 
    s与L1后续链对接
end if
if 未到达L2链尾 
    s与L2后续链对接
end if

2.2.2代码截图

2.2.3本题PTA提交列表说明。

  • Q1:这题我的原思路不是这样的,原代码:结果:
    这个点一直过不去,自己测试的几个数据有几个点确实过不去,发现自己的代码在判断重复数据时还是有遗漏。
  • Q2:后来我换了一种写法,代码变成了这样:

,显然要更严密一些,之前过不去的自己找的测试数据也成功地过了,开开心心跑去交了。但是结果却是:发现再建一条链要更加浪费空间,显然不如把各个结点穿插重构成一条新的链表的好。于是问题就这么解决了。

2.3 题目3:题目名称

7-2 一元多项式的乘法与加法运算 (20 分)

设计函数分别求两个一元多项式的乘积与和。
输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。
输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。零多项式应输出0 0。

2.3.1设计思路(伪代码)

思路:
这题稍微让我有点自闭了,这一题我至少花了24个小时在上面,然而到现在也有一个点过不去.....这道题有两个思路,我的思路是,先算出结果式子,再对其进行化简,其中包括了排序以及同类项的合并,以及系数为零的处理。而这一思路可能比较复杂,但还是比较直观的,但个人认为至少逻辑上没什么大问题。后面我会再用插入的方法重写一下。
伪代码:


2.3.2代码截图








2.3.3本题PTA提交列表说明。

  • Q1:最早的多种错误,是因为没有看清楚自己的输出,没合并同类项就交上去了......后面添加了化简的函数就能和测试样例一样了。

  • Q2:中间12分的bug主要是没有考虑到零多项式。后面我对系数为零的情况进行了多次的控制。

  • Q3:最后的代码交上去变成了这样

    后来又前前后后改了七八个小bug来达到预期效果......还是过不去,这时候已经花了接近24个小时了,我对自己的总体思路产生了怀疑,我看了其他同学的博客园,基本上都不是用我这种思路,所以我决定再用插入的那种思路重新打一遍......在那之前我得冷静冷静......

3、阅读代码

3.1 题目

3.2 解题思路

题目很简单,主要提供三种思路:迭代、递归、头插法,观察三种不同解法消耗的时间与空间差异。

3.3 代码截图




3.4 学习体会

根据结果来看,三种解法在时间上的差异不大,而在空间的消耗上迭代法要优于头插法与递归法。

posted @ 2019-03-31 00:05  super饭团君  阅读(563)  评论(2编辑  收藏  举报