1.思维导图及学习体会
1.1思维导图
1.2 学习体会
- 1. 我觉得学习的顺序表还有单链表就像上学期所学习的数组与链表,顺序表是结构体里面有个数组还有个数组长度。顺序表操作还有理解起来相对容易些,而单链表就…呵呵…难度大了很多,特别是在做PTA时候,有时候没有考虑到空指针的情况,然后还老是找不出来,一旦对空指针进行操作程序就崩溃了,所以做题时候还是得拿着纸拿着笔在那画线,还要考虑充分,不然有时候下一个节点为空之类的没考虑到又去进行操作这类似的情况,还有删除元素插入元素等等,感觉写代码就是写bug,觉得自己凉飕飕的。虽然在一些操作上顺序表是比链表时间复杂度上来的多,但我觉得还是顺序表看起来好理解 。
- 2. 也学习到了一些牛逼的方法如重构链表的方法还有两个有序表的归并也觉得挺神奇的,还有得多看书上的代码,有讲解好懂一些以及课堂派上的方法技巧,以后做相关题才有思路。
2.PTA实验作业
2.1.题目1:顺序表删除重复元素
设计一个算法,从顺序表中删除重复的元素,并使剩余元素间的相对次序保存不变。
输入格式: 第一行输入顺序表长度。 第二行输入顺序表数据元素。中间空格隔开。
输出格式:数据之间空格隔开,最后一项尾部不带空格。
输出删除重复元素后的顺序表。
2.1.1设计思路(伪代码)
void CreateSqList(List &L,int a[],int n)
动态申请内存;
for循环遍历数组a[n]将数组a[n]一个个赋入线性表中;
void DelSameNode(List &L)
定义i和j:
定义静态数组temp用来记录数据是否重复和TEMP用来存储顺序表的值;
for i=0 to L->length
将顺序表中的数据赋入data数组;
end for
for i=0 to L->length //遍历整个顺序表 查找重复数据 如果有重复数据 则记录下该位置并将temp值为1
for j=i+1 to L->length
if L->data[i]=L->data[j]
then temp[j]=1;
end for
end for
//重构数组 将没有重复数据的重构 之前存储在TEMP的值可以用了
for i=0 to L->length
if temp[i]==0 then
L->data[k++]=TEMP[i];
end for
L->length=k; //新的数组长度
2.1.2代码截图
2.1.3本题PTA提交列表说明。
- Q1:一开始只对了个空表的测试点后来改着改着连空表这个测试点也错了变成另外一个测试点过了
- A1:我起初不是用这种方法的,而是利用比较麻烦的方法,我一边查找一旦找到重复的数据就后面的数组都往前一位,这样子很麻烦,而且无法处理一些测试点
- Q2:后来我改用这种方法来解决,然后全是重复数据以及无重复数据这两个测试点经常一个能过另外一个就过不了
- A2:一开始全是重复数据这一测试点过不了,我发现是我直接在L上面直接进行修改数据,这样子如果这个顺序表全是重复的话会直接全部删光一个也没有,我改正就是在定义一个数组用来修改
- Q3:最后一个测试点是无重复数据这一点过不去,修改很久一直没法改正
- A3:舍友帮助我修改的,我一开始定义的中间变量数组data和flag,我忘记了得用static定义,导致他们里面不是为0,后面出错了
2.2.题目1:-链表倒数第m个数
已知一个带有表头节点的单链表,查找链表中倒数第m个位置上的节点。
输入要求:先输入链表结点个数,再输入链表数据,再输入m表示倒数第m个位置。
输出要求,若能找到则输出相应位置,要是输入无效位置,则输出-1。
2.2.1设计思路(伪代码)
int Find(LinkList L, int m )
if L为空 或 m为负数 //空指针或者m不合法
return -1
定义 temp=0 ,n=-1
定义LinkList类型的指针 s,r,r指向L下一个节点
while r不为空 do //查找倒数第m个
if n等于m+1 then //找到倒数第m个
temp=1 返回r->data
end if
n++
r指针往下移
end while
if temp等于0 then//没找到
return -1
end if
2.2.2代码截图
2.2.3本题PTA提交列表说明。
- Q1:一开始位置无效的测试点过不去 没搞懂什么意思,以为是链表为空或者是m为负数 ,可我也加了这些条件后还是错的
- A1:是我忘记了倒数第m个数就是正数第m+1个数,导致错误,我举了例子来看看,才发现我判断条件错误,也是测试数据跟答案不一样的原因
- Q2:我就改了判断条件交上去。。。没想到对了,然后还有些地方搞不太懂,就又改了点地方,又交了上去。。。就错了
- A2:比如我还想了下当这个m超过了这条链长该怎样做,后来改的改的,才发现,好像倒数的就没有超过这链长的说法
2.3.题目1:有序链表合并
已知两个递增链表序列L1与L2,2个链表都是带头结点链表。设计函数实现L1,L2的合并,合并的链表仍然递增有序,头结点为L1的头结点。 合并后需要去除重复元素。
输入格式: 输入分两行,先输入数据项个数,再输入数据项,数字用空格间隔。
输出格式: 在一行中输出合并后新的递增链表,数字间用空格分开,结尾不能有多余空格;
2.3.1设计思路(伪代码)
定义LinkList类型的指针,PL1为L1的遍历指针并指向L1的首结点,PL2为L2的遍历指针并指向L2的首结点,temp3,
定义LinkList类型的指针 s为放置数据域
temp3为保存L1的指针
while PL1&&PL2 do //查找两链表共同的长度 将者共同的部分进行排序
if PL1指向的data大于PL2指向的data while PL1不为空 then //当L1的数据域大于L2的时候 将L2的数据存入新建立的接点s中 并将PL2后移
创立新节点s 并将PL2的数据域存入s数据域中
利用尾插法将temp3连起来
PL2继续往后移
else if PL1指向的data小于PL2指向的data //当L2的数据大于L1 将L1的数据存入新建立的接点s中 并将PL1后移
重复上一步骤 只是存进的是PL1的数据域以及PL1后移
else //当两个数据一样时候只要移动一个就可以 在这个条件语句中相当于只移动L1
if 1 then
PL1后移
else PL2后移
end while
while PL1不为空 then //当PL1不空时候将后面的数据不断存入新建的s接在L1后
创立新节点s 并将PL1的数据域存入s数据域中
利用尾插法将temp3连起来
PL1继续往后移
end while;
while PL2不为空 then
创立新节点s 并将PL2的数据域存入s数据域中
利用尾插法将temp3连起来
PL2继续往后移
end while;
temp3尾节点设为空
}
2.3.2代码截图
2.3.3本题PTA提交列表说明。
- Q1:各种错误都有,后面还有死循环这种好久没出现的问题
- A1:空表是一开始正确的测试点,后面连这五分也没了,我起初是直接在L1上进行修改的,本来也没考虑太多,想着既然是要合并到L1,就直接修改L1,导致一开始很多错误
- Q2:重复数据这一测试点过不了,而且看不出哪里有错改的时候Devc还会崩溃
- A2:然后就请教大佬来帮忙看下哪里有错,原来是当两者重复的时候,我只移动了两个指针,没有将他们重复的数据至少存一个进去,然后我就只移动一个另一个不动,在下一次循环的时候,就可以将重复数据存进去了
3、阅读代码
3.1 题目 单链表冒泡排序
3.2 解题思路
做法类似于数组的冒泡法
- 1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。
- 2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。
- 3.针对所有的元素重复以上的步骤,直到没有任何一对数字需要比较。
3.3 代码截图
3.4 学习体会
- 1. 一开始如果自己来写代码的话,在交换数值这一做法上我不会再去构造个函数的,会直接在这函数里面写进去,他在构造个函数感觉会更好用,可以在该函数内更少操作
- 2.对于单链表的排序,在pta啊有过两条链表的归并, 但在单条链表上的排序没做过,之前也没想过这个问题。。。看到有人用熟悉的冒泡法做了就拿出来分享了
- 3.还有一点我搞不懂,就是为什么在第一个for循环中每次循环cur要等于head,那样在下一个循环中的if比较中不会有问题吗