DS博客作业02-线性表
1.本周学习总结
1.1思维导图
1.2.对线性表的认识及学习体会
1.线性表的内容上了几星期的课,我觉得线性表的内容还是很丰富的,有插入啊,删除啊,合并啊等等算法,这些都是比较基础的操作,要尽量把它学好,这样对于以后更高阶的算法会比较轻松。
2.印象中比较重要的就是链表了,链表中比较基础的操作就是头插法和尾插法了,我觉得链表要注意的就是指针所指的位置了,在进行操作的时候可不能乱了,这样会导致链表断了,会出现错误。要把链表学好,这样对于后面的栈等算法有很大的好处。
3.对于这次的pta作业,有很多是书上有的,不会的话可以参考书籍,或者是自己已经写好了,可以去参考一下书上的代码,因为书上的代码都是一些简单易懂的算法,而且它的算法复杂度也是比较低的,所以可以多参考参考书籍。
4.对于要写出优秀的算法那肯定不是可以马上学成的,需要经过时间,以及大量的编程来训练自己,有时候觉得自己的代码写得不好的话也可以多参考参考同学的代码,多理解理解,不会的话还可以请教同学,然后进行消化,最后成为自己的东西。
2.PTA实验作业
2.1.题目1:题目名称
jmu-ds- 顺序表删除重复元素
2.1.1设计思路(伪代码)
设计思路:创建两个静态数组a,b,用数组a来判断该数是否重复,用数组b来保存没重复的数,最后令线性表等于数组b;
- void CreateSqList(List &L,int a[],int n)创建有序表
L动态申请内存;
令L->length等于n;
定义i用来循环
for i=0 to i<n
L->data[i]=a[i];
end for
- void DelSameNode(List &L)删除重复元素
int i=j=k=0控制循环
//判断是否重复
for i=0 to i<L->length
for i=0 to i<L->length
if L->data[j]等于L->data[i] then a[j]=1
end for
end for
//删除重复的数
for i=0 to i<L->length
if 第i个元素重复 then continue
else b[k]=L->data[i] k++
end for
//把删除后的数组转移到线性表
for k=0 to k<L->length
L->data[k]=b[k]
2.1.2代码截图
2.1.3本题PTA提交列表说明。
PS:由于是在DEVC上写好的代码,也是在上面进行调试的,所以在PTA的提交列表中出现错误的会比较少,其实也是调试挺久的。
- Q1:写该题的时候思路还是挺清晰的,因为该题和以前的数组删除重复元素是差不多的,所以写的时候就有思路了,可是由于一开始马虎定义数组的时候没有用静态定义,所以出现了错误。
- A1:后来改用静态static来定义,问题才解决了。
- Q2:之后又出现了段错误的结果,找了很还是没有找到,要调试也不行,所以只好找以前的代码进行一下比较,才发现原来是循环哪里定义的时候出错了。
- A2:开始的时候我把j=i,所以导致了错误,后来改成j=i+1,才解决了问题。
- A3:最后还有一点就是删除完要对线性表的长度进行从新的定义,不然也会出错的。
2.2.题目2:题目名称
jmu-ds-单链表逆置
2.2.1设计思路(伪代码)
设计思路:定义指针p来遍历链表,指针q用来指要逆置的节点,p,q同时移动,q指针移动到头结点L的后面,最终完成链表的转置。
- void ReverseList(LinkList &L)链表逆置
定义p用来遍历指针,q用来指向要转置的节点
p指向L->next
L->next=NULL
//对链表进行转置
while p do
q=p做为要转置的节点
p=p->next
q->next=L->next将要转置的节点连接到头结点的后面
L->next=q
end while
2.2.2代码截图
2.2.3本题PTA提交列表说明。
- Q1:做这题的时候一开始是有一个很幼稚的想法的,那就是使用就像p->next=p;然后这样就可以进行指针往前移动,一开始以为这就可以了。
- A1:然后在打了之后才发现是错误的想法,使用就去询问了老师,原来这样是不可以的,而且会使链表断掉,要指针前移就用双链表。
- Q2:后来才想到的现在写的方法,这方法也是想了很久的,也是最简洁的。
- A2:之前是定义了一个新的数组用来存放所有的数,最后再进行赋值一个个重新赋值。很麻烦。4
- Q3:一开始我先把指针p往后移动了,而没有把q指向p,所以出现了错误。
- A3: 修改过后就正确了。
2.3.题目3:题目名称
jmu-ds-有序链表合并
2.3.1设计思路(伪代码)
设计思路:
- void MergeList(LinkList &L1,LinkList L2)有序链表合并
定义指针,pa为L1的遍历指针并指向L1的首结点,pb为L2的遍历指针并指向L2的首结点
定义指针 s为放置数据域,r
r为保存L1的指针
//查找两链表共同的长度进行排序
while pa&&pb do
if pa->data<pb->data then //当pa的数据域小于pb的时候
创立新节点s 并将pa的数据域存入s数据域中
利用尾插法将s连起来
pa继续往后移
else if pa->data>pb->data //当pa的数据大于pb
创立新节点s 并将pb的数据域存入s数据域中
利用尾插法将s连起来
pb继续往后移
else //当两个数据一样时候
创立新节点s 并将pa的数据域存入s数据域中
利用尾插法将s连起来
pa,pb继续往后移
end while
//当pa不空时候
while pa不为空 do
创立新节点s并将pa的数据域存入s数据域中
利用尾插法将r连起来
pa继续往后移
end while
//当pb不空时候
while pb不为空 do
创立新节点s 并将pb的数据域存入s数据域中
利用尾插法将r连起来
pb继续往后移
end while
r尾节点设为空
2.3.2代码截图
2.3.3本题PTA提交列表说明。
- Q1:写这道题的时候一开始我用的方法是建立一个新的指针指向L1的首节点,然后开始进行比较两条链各个节点的大小进行排序,也就是在两条链之间接来接去形成一条链。
- A1:但是由于不知道哪出错了,一直改不出来,然后我就换了新的方法。
- Q2:换了一个新建一个节点用来储存数据,然后尾插法接到新建的链上。
- Q3: 一开始新建链表节点的时候由于LNode写成Link,所以一直出现错误,但是由于这是很低级的错误,所以找了很久。
- A3:最后还是找了同学来看一下子就看出来了,这也说明了越低级的错误越要注意。
3、阅读代码
3.1 题目
- 单链表冒泡排序
3.2 解题思路
该题的解法与数组的冒泡排序差不多。
1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。
2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。
3.针对所有的元素重复以上的步骤,直到没有任何一对数字需要比较。
3.3 代码截图
3.4 学习体会
1.如果一开始让我来写这道题目,我循环的条件可能就不会用得那么准确,我可能会定义一个新的指针指向头结点,然后遍历链表,然后算出链表的长度,在定义i来控制循环,但是这样明显是比较麻烦的,要用该题的解法,就是以指针是否为空做为循环的条件,并进行指针的移动。
2.还有就是在交换数值这一做法上我不会再去构造个函数的,会直接定义一个交换的变量temp,他在构造个函数感觉会更好用,可以在该函数内更少操作。
3.但是有一点不明白的就是为什么在第一个for循环中每次循环cur都要等于head,那样在下一个循环中的if比较中好像有点儿问题吧。