一、PTA实验作业(5分)
1.题目1:7-1 最长连续递增子序列
2. 设计思路(伪代码或流程图)
定义变量i,j,k,n存储输入的位数,maxi存储最大子链的位置,数组a存储数链
输入n
for i=0 to n
输入a[i]
end for
创建顺序表L 申请空间L= new (SqList)
for i=0 to n
L->data[i]=a[i]
end for
长度改变 L->length=n;
寻找最长子链的位置
for i=0 to L->Length {
a[i]=0 数组的值为i位置连续子链的长度初始为0
for j to L->Length {
比较L->data[j]与L->data[j+1]的值
较小的话a[i]++ 否则 break;
end for
end for
寻找数组中所有值中的最大值放在maxi
for i=0 to L->length-1
如果 a[i]>max)
max=a[i];maxi=i;
end for
for i=maxi to L->data[i]<L->data[i+1]
输出 顺序表L->data[i]的值
end for
delete L 摧毁链表
3.代码截图
4.PTA提交列表说明。
-
- 最先我做这道题的时候我是考虑用数组就是的下标来表示顺序表的第几位数,然后子链的长度存放在数组中,就可以找出最长的连续子链,我的错误在于第一是对于最大的N,我写的是100000,
要改成100001。
1.题目2:6-2 jmu-ds-单链表逆置
2. 设计思路(伪代码或流程图)
void ReverseList(List &L)//主要介绍逆置的函数部分
定义结构体 尾r,存储s,q
申请空间r=(List)malloc(sizeof(ListNode));
定义头结点r->next=NULL;
存储头结点的位置q=L->next;
L->next=NULL;
while(q!=NULL)
申请s空间
s->data= q->data;
拆掉节点用头插法使链表倒置
L->next=s;
q=q->next;
.end
3.代码截图
4.PTA提交列表说明。
- 这道题我遇到的主要问题是处理空链表的问题,这也是我遇到的很多问题,所以我也拿出来特地说一下,因为我在调试的时候是很难调出来的,在每次的处理链表要先判断是否有为空的情况,还有就是如果
q=r->next=NULL 那么要是写出q->next 就会出错,但是还是会运行。
1.题目3:7-1 两个有序链表序列的合并(20 分)
2. 设计思路(伪代码或流程图)
定义三个链表S1,S2,S3
创建链表CreateListR(S1)//这个函数比较简单这里不详细写出
创建链表CreateListR(S2);
void Union(LinkList ha,LinkList hb,LinkList &hc){
定义pa pb节点存储头结点 r,s尾插法用的节点
hc申请空间
r=hc来记录节点
while(pa!=NULL&&pb!=NULL){
如果pa->data小于pb->data
申请空间s
s->data=pa->data
pa=pa->next;
利用尾插法来插入s在新的链表hc
若小的话
s->data=pb->data
利用尾插法来插入s在新的链表hc
pb=pb->next;
end }
while(pa!=NULL) 分别判断pa与pb是否结束,再分别用尾插法插入在hc中
s=(LinkList )malloc(sizeof(LNode))
s->data=pa->data;
r->next=s;
r=s;
pa=pa->next;}
3.代码截图
4.PTA提交列表说明。
- 这题的问题是我忘记了链表的合并,因为是有序链表所以只要从前一个一个比较就行,但是相等的情况我考虑的进去,这题是没有要求相等去掉的所以导致一个点错了,
还有就是在摧毁链表的时候忘记删掉前一个节点,在代码中有注释,导致错误。
二、截图本周题目集的PTA最后排名(3分
1.顺序表PTA排名
2.链表PTA排名
3.我的总分:245
三、本周学习总结(2分)
1.谈谈你本周数据结构学习时间是如何安排,对自己安排满意么,若不满意,打算做什么改变?(1分)
- 我是是在预习作业打不厚开始看书,再自己理解一遍,上课的时候可以更好的理解。
- pta我是一题一题慢慢做,慢慢理解,一般是在前几题做起来比较慢后面就比较快点了,时间一般是没课的时候做
- 这学期的链表学习相比上学期代码量多了许多,调试也比较麻烦,所以要花多点的时间,所以我希望可以少玩点游戏来学习。
2.谈谈你对线性表的认识?
- 这周我们学了顺序表与链表,在处理数据时可以对表进行合并,插入,删除,输出,等操作,已达到对数据的统一整理,两种数据处理方式各有各的优点,
相比之下我比较喜欢链表的方法,因为这个用起来比较灵活,对于数据的各种操作比较方便。而且有循环链表,双链表的特殊链表也可以实现更多的操作。
以及头插法,尾插法的不同排列。
3.代码Git提交记录截图
四、阅读代码
- 这是多项式的除法的代码,我本来在做这道题的时候没有思路,后来在网上找这个代码。不过他采用的是用数组的做法,我想找链表的做法不过没找到,而且舍友用链表的方法一直运行超时,所以我就采用了这个代码的方法。
- 这个代码是建立两个数组,数组的下标代表系数,数值代表指数,这是这个代码重要的一个点,用一个数组来代表一个多项式的一个项,这也是对数据处理的一个很好的方式,除法的部分是用A的当前最高位除以B的当前最高位求出当前商Q,然后对当前A减去Q*B,直到A的最高阶小于B的最高阶,也是除法在数组运用,这是值得学习的地方。