0.PTA得分截图
1.本周学习总结
1.1 线性表内容总结
1.1.1顺序表结构体
1.1.1.1定义
#define MaxSize 100
struct student
{
int data[maxsize];
int length; //记录顺序表最后一个数据的位置
}
如上代码定义了一个最大数据存储量为101的顺序表结构体。
1.1.1.2顺序表插入
现在假设已有顺序表S,要将数据x插入至第p个位置
伪代码
if p大于length
S->data[p-1]赋值为x
else p小于length
for length to p
数组后移一位
S->data[p-1]赋值为x
代码
if(p>length)
{
s->data[p]=x;
}
else
{
for(i=length;i>=p;i--)
{
s->data[i]=s->data[i-1];
}
s->data[p-1]=x;
}
1.1.1.3顺序表数据删除
现在假设已有顺序表S,要将第p个位置的数据删除
伪代码
if p大于length
删除位置无效,返回false
else p小于length
for p-1 to length-1
数组前移一位
代码
if(p>length)
{
return false;
}
else
{
for(i=p-1;i<=length-1;i++)
{
s->data[i]=s->data[i+1];
}
}
1.1.2链表结构体定义
1.1.2.1头插法
伪代码
建立新空列表,头指针为L
for i=1 to i<=n
{
建立新节点Node
Node->next指向L->next
L->next指向Node
}
1.1.2.2尾插法
伪代码
建立新空链表,头指针为L
前驱指针为pre指向L
for i=1 to i<=n
{
建立新节点Node
Node->next指向pre->next
pre->next指向Node
pre指向下一个节点
}
1.1.2.3链表插入
伪代码
通过前驱指针pre遍历链表找到插入点
新建节点Node
Node->next指向pre->next
pre->next指向Node
pre指向其下一个节点pre->next
1.1.2.4删除操作
伪代码
通过前驱指针pre遍历链表找到插入点
temp指向pre->next
pre->next指向pre->next->next,即更后一个节点
删除 temp
1.1.3有序表
1.1.3.1有序单链表数据插入和删除
同上!!!!同上!!!!
1.1.3.2有序表合并
假设现有两个数据递减的有序表L1和L2,将其有序合并且延用L1的头节点
法一:借助数组
法二:借助L3
法三:直接法(推荐)
- L1作为主链被比较
- 若L2中节点数据找到L1中第一个比它小的数据便插在其前端
- L1若阅尽则L2未比较元素按顺序接到L1后面
图示
推荐原因:时间复杂度最小,为O(n);不需要占用新的空间,空间复杂度最小,为O(1)
1.1.4特殊链表
1.1.4.1循环链表
1.1.4.2双链表
s->next=p->next;
p->next->prior=s;
s->prioe=p;
p->next=s;
节点的删除
temp=p->next;
p->next->next->prior=p;
p->next=p->next->next;
delete temp;
1.2谈谈你对线性表的认识及学习体会。
线性表即是一条在计算机中牢固的关系绳子。对于顺序表来说,上学期对数组的掌握够扎实便可轻松应付;而对于链表,操作难度更高,数据存储更灵活,抽象思维的要求需要更强,基本的链表插入,删除,排序的代码需要多加训练才能熟练编写,更值得一提的是,要学会画链表操作示意图来帮助我们寻找解决问题的方法
2.PTA实验作业(0-2分)
选3道PTA题目,不写伪代码,只贴代码截图,并记录代码提交碰到问题及解决方法。必须选择线性结构应用题目,不得选操作集类似题目,头插法、尾插法、链表逆转也不得选。(选,则为0分)选择难度越高题目得分越高。
2.1.题目1:链表分割
2.1.1思路图
2.1.2代码截图
2.1.3PTA提交列表说明
Q1:考虑了跳跃式移动的方式遍历L1(pre指针一直指向数列an的各个数据),写好代码后发生了段错误。
A1:仔细检查发现原来是用辅助指针将bn的数据接入L2时,忘记记录下一个数据的位置,即忘记让pre=pre->next,补上后得到解决。
Q2:再次提交依然是段错误,仔细检查代码后发现没有什么错误。
A2:后来试图从题目入手,检查提给信息是否遗漏,仔细看样例,发现L1的最后一个数据节点不一定是bn,而有可能是an,所以我在遍历L1的循环中加入了另外一个退出循环的条件,即pre->next==NULL,又在其下面加了一个if语句来判断最后一个数据是an还是bn。
2.2 题目2:7-2 一元多项式的乘法与加法运算
2.2.1 思路图
2.2.2代码截图
2.2.3PTA提交列表说明
Q1:忘记考虑0多项式的情况
A1:当L1或者L2数据相乘时,两个数据只要其中一个的系数为0,直接将其结果的系数和指数赋值为0;
Q1:在vs中代码测试发现不管怎样,关于两个多项式的乘法得到最后的结果总会少掉最后一项,求和没问题。
A1:奈何能力有限,调试了好几个小时也没办法!!!!
2.3 题目3:链表倒数第m个数
2.2.1思路图
2.2.2代码截图
2.2.3提交列表及说明
Q1:段错误:我的代码体现的方法是思路一,即先遍历链表求长度,记录在count。
A1:发现我的循环pre走到NULL时会多记录一次长度,即把NULL都算进去了,导致我输出某个结果时非法访问空间了,我在下面加上一个count--,问题得到解决
Q2:解决问题一后提交发现,测试点有三个,分别是一个有效情况,两种无效情况,我有一种无效情况测试点产生了段错误,而我将空链表的情况和m比count大的情况已经考虑了,所以不知道哪里还有错。
A1:后来仔细想了想,如果m是负数或者0呢,我将m<=0加入到if判断中,提交后得到解决
3.阅读代码(0--4分)
找2份优秀代码,理解代码功能,并讲出你所选代码优点及可以学习地方。主要找以下类型代码:
考研题种关于线性表内容。可以找参加过考研的学长学姐拿。尤其是想要考研同学,可以结合本章内容,用考研题训练学习。
ACM题解
leecode面试刷题网站,找线性表相关题目阅读分析。
leecode经典题目
注意:不能选教师布置在PTA的题目。完成内容如下。
3.1 题目及解题代码
可截图,或复制代码,需要用代码符号渲染。
3.1.1 该题的设计思路
链表题目,请用图形方式展示解决方法。同时分析该题的算法时间复杂度和空间复杂度。
3.1.2 该题的伪代码
文字+代码简要介绍本题思路
3.1.3 运行结果
网上题解给的答案不一定能跑,请把代码复制自己运行完成,并截图。
3.1.4分析该题目解题优势及难