一、PTA实验作业
题目1:7-1 最长连续递增子序列
给定一个顺序存储的线性表,请设计一个算法查找该线性表中最长的连续递增子序列。
例如,(1,9,2,5,7,3,4,6,8,0)中最长的递增子序列为(3,4,6,8)
1. 设计思路(伪代码或流程图)
/*查找最长连续递增子序列函数 */
定义整型变量i,j表示循环变量,k用来作找到后新数组下标
定义整型变量 MaxLength=1; //MaxLength为1, 表示长度只有头部
定义整型 a[maxsize]存放最长连续递增子序列
for i=0 to L->length
a[i]=1; //表示长度只有头部
for i=0 to L->length-1
for i=0 to L->length-1
如果 前一个元素 > 后一个元素
a[i]++
否则 break
找到后:
for i=0 to L->length
如果 a[i] > MaxLength,k=i
如果 长度为1,直接输出此数
如果 长度为0,return
输出最后结果
end for
2.代码截图
3.PTA提交列表说明
- 编译错误。把PTA中的C改成C++后提交;
- 部分正确。没有考虑只有一个数时的情况,需要再加上if(MaxLength==1)时,直接输出这个数;
题目2:6-2 jmu-ds-单链表逆置
本题要求实现一个函数,将给定单向链表逆置,即表头置为表尾,表尾置为表头。链表为带头结点链表。
(单链表基本操作根据老师发的变化。)
1. 设计思路(伪代码或流程图)
/*逆置函数void ReverseList(List &L)调用 */
如果链表L 为空表||只有有一个元素
输出 NULL,不逆置
定义指针p,q ListNode *p,*q移动
令p指向L的第二个数据
while(p)
q 保存下p的值 ,p移动
p的next指向前一个元素
L->next的值不断变化,循环
end for
2.代码截图
3.PTA提交列表说明
- 需要考虑空表或仅仅只有有个元素时,不需要逆置;
- 答案错误。输入1 2 3 4 5逆置后输出4 3 2 1,修改第一个输出所指结点输出;
- 部分正确。猜想是逆置函数出错,注释掉其他函数,再读代码,查找出错地方,修改:在建模输入值时循环条件出错,将for(i=1;i<n;i++)改为for(i=1;i<=n;i++);
- 格式错误。输出函数,最后一个无空格;
题目3:7-3 两个有序序列的中位数
1. 设计思路(伪代码或流程图)
先类似7-1将给出的两个链表S1,S2合并,用链表S3装好
/*查找中位数int Find(LinkList S3, int m,int n)调用*/
m为中位数下标
定义整型变量j=0 表示S3下标
定义整型变量length=2*n表示合并后S3长度
定义 LinkList p=S3方便进行移动
如果 p为空 return 0
当 j<=m 时
j递增
p移动
直到j==m找到
返回找到的下标所指的值
end for
2.代码截图
3.PTA提交列表说明
- 编译错误。忘记把PTA中的C改成C++后提交;
- 段错误。之前把合并后的S3先输出来,函数没注释掉,不用输出,直接输出中位数的值;
- 答案错误。中位数查出错误,函数出错,检查发现length长度在合并后没有及时改变,应该变成2n;
二、截图本周题目集的PTA最后排名
1.顺序表PTA排名
2.链表PTA排名
3.我的总分:215
三、本周学习总结
1.谈谈你本周数据结构学习时间是如何安排,对自己安排满意么,若不满意,打算做什么改变?
- 课前完成老师布置的预习作业,然后平时上数据结构课程,课后完成相应的PTA练习题;
- 不太满意。除了老师安排的固定学习外可以自己课下多看数据结构书,看看代码和解题思路;
- 编程上不懂的地方先上网自己尝试弄懂,如果不行,请教同学;
2.谈谈你对线性表的认识?
主观认识:线性表是一种数据结构,能表示出前后相同元素之间的关系,让元素有规律的排列或组合;
本章小结:
(1)线性表的定义。线性表是具有相同特性的数据元素的一个有限序列;
(2)线性表的抽象数据类型描述。
ADT List {
数据对象:D={ | ∈ ElemSet, i=1,2,...,n, n≥0 }
数据关系:R1={ <ai-1 ,ai >| ,∈D, i=2,...,n }
基本操作:
{ 结构初始化 InitList( &L ) }
操作结果:构造一个空的线性表 L
{ 销毁结构 DestroyList( &L ) }
}
(3)线性表的顺序存储结构---顺序表及其运用。
包括顺序表的建立、初始化线性表、销毁线性表、判断是否为空表、求线性表长度、输出线性表,
还有在线性表中进行某些基本操作运算:如: 求线性表中某个数据元素值、按元素值查找 、插入元素值、 删除元素值;
(4)线性表的链式存储结构---链表,分有单链表、双链表和循环链表及其运用。
单链表中,每个节点有一个指针域,指向其后继节点,进行操作 时,除了对该节点操作外,还需要考虑其前后的节点;
单链表也有顺序表里面的基本操作:删除、插入、建表(头插法或尾插法,头插法会逆序输出)、初始化、销毁等;
双链表中,每个节点有两个指针域,一个指向其后继节点,另一个指向其前驱节点;
建立双链表也有两种方法:头插法或尾插法,基本操作跟单链表同;
插入节点(如:s插入p后):
s->next=p->next;
p->next->prior=s;
s->prior=p;
p->next=s;
删除节点(如:删除p后的节点,得修改两个指针域):
p->next=q->next;
q->next->prior=p;
(5)循环链表,是另一种形式的链式存储结构。
特点:表中尾节点的指针域不再是空,而是指向头节点,整个链表形成一个环,因此,从表中任一个节点出发均可找到链表中其他节点;
基本运算:与非循环链表基本相同,只对表尾的判断作了改变,例如,在循环单链表或循环双链表L中,判断表尾节点p的条件是p->next==L;
(6)有序表,指其中所有元素以递增或递减方式有序排列的线性表。
有序表的存储结构及其基本运算:
若以顺序表存储,除插入函数外其余运算基本相同,扫描L,找到插入位置 i,将data[ i ]及后面元素后移一个位置,插入元素e;
若以单链表存储,除插入函数外其余运算基本相同,查找前驱节点pre,创建放e的数据节点p,在pre后插入*p节点;
有序表的归并。将两个有序表合并成一个有序表---二路归并法。
二路归并法:
分别扫描LA和LB两个有序表,两个均未扫描完时,比较LA和LB当前元素,较小的放入LC中,再从较小元素所在的有序表中取下一个元素,重复此过程直到 LA或LB比较完毕,最后将没有比较完的有序表中余下的元素放入LC中;