DS博客作业02--线性表
1.本周学习总结
1.1思维导图
1.2.谈谈你对线性表的认识及学习体会
初学线性表,也感觉到数据结构的一大难点,首先是顺序表,顺序表和数组类似,储存位置是连续的,但是顺序表多了长度length,
麻烦的是顺序表的插入和删除需要移动一大部分数据。有序表就是把数据排好序,有序表可以用顺序表储存,也可以用单链表储存。
链表有单链表和双链表、循环链表,链表在处理数据的插入和删除有明显的便捷。当然,在线性表中,运用了很多算法,然而算法
是一个比较困难的部分,需要花大量时间去理解,才能够消化。
2.PTA实验作业
2.1.题目1:
要求实现3个函数,在递增的顺序表中插入一个新整数,并保持该顺序表的有序性
2.1.1设计思路(伪代码)
遍历顺序表,记录要插入的位置i,将i后面的数据后移,将要插入的数据插入位置i
定义i,j
for i=0 to n-1
if L->data[i]>x //寻找到要插入的位置
break;
end for
for j=n to i //将L的第i项后的后移一位
L->data[j]=L->data[j-1]
L->data[i]=x //将x插入到i的位置
2.1.2代码截图
2.1.3本题PTA提交列表说明
Q1:考虑范围时没有考虑完整
A1:经过几次数据输入验证,调试好范围
2.2.题目2:
本题要求实现一个函数,将给定单向链表逆置,即表头置为表尾,表尾置为表头。链表为带头结点链表。请实现逆转函数
2.2.1设计思路(伪代码)
新建一个链表,将L链表用头插法读取到新建的链表里
申请node,head结点
为newL申请动态空间
让head为newL的头节点;
while L->next //利用头插法,把L链表的值重构到新链表里
让 node->next 指向 newL->next
让 newL->next 指向 node
L 指向 L->next;
end while
L=head;
2.2.2代码截图
2.2.3本题PTA提交列表说明
Q1:编译错误是L传参的结构体名错误
A1:在编译软件改了结构体,忘了pta里給的是函数,结构体不能改
Q2:后来只有空链表可以过
A2:修改了循环里链的关系
2.3.题目3:
链表L是一个有序的带头结点链表,实现有序链表插入删除操作。
2.3.1设计思路(伪代码)
插入:遍历链表,以L->next->data与要插入的e作比较,当L->next->data大于e时,
让e所在的结点指向L->next,L->next指向e所在的结点
删除:遍历链表,找到L->next->data与要删除的e作比较,找到后,令L->next指向
L->next->next;
while p->next //以p->next为判断的好处的,可以找到等于e的上个节点
if p->next->data >= e
break
p 指向 p->next
end while
r->next 指向 p->next
p->next 指向 r
2.3.2代码截图
2.3.3本题PTA提交列表说明
Q1:链表全删这个点没考虑到
A1:反复看题目才发现,看题很重要啊
3、阅读代码
3.1 题目
线性表是n个元素的有序集合(n≥0),n是线性表中元素的个数,称为线性表的长度。可以用一组地址连续的存储单元依次
存储线性表中元素,采用这种存储方式的线性表称为顺序表。请在顺序表上实现运算,实现顺序表的逆置,删除表中所有
元素值等于x的元素
输入
三组数据,顺序表元素类型分别为整型、字符型和实型。
每一组第一行给出元素数目n(0<n≤1000),第二行给出元素数值,第三行给出待删除的元素。
输出
三组数据,每一组第一行给出逆置后的顺序表元素,第二行是在此基础上删除指定元素后的顺序表元素,每一个输出元素后
均有一个空格,如果元素全部被删除,那么输出一个空行。
3.2 解题思路
初始化线性表,将数据写入线性表中,都是运用头插法,删除就是遍历查找相同,找到后改变结点指向
3.3 代码截图
3.4 学习体会
写法上比较简洁,而且使用标记,这样使得判断更加简单方便,在删除函数里,return 返回可以区别是否有找到要删除的数
逆置使用的是数组,觉得还是用链表比较节约空间