博客作业2---线性表
一、PTA实验作业
题目1:7-1 最长连续递增子序列
1. 设计思路
首先定义了一个结构体变量struct node{
int m,count;//m用来存放数据,count用来记录顺序最多的次数。
}s[100002];
利用循环输入数据,并赋予每个结点中count初值1.
利用嵌套循环计算出最长连续递增子序列.
定义sum放最长连续递增子序列的结束下标,t放最长连续递增子序列的起始下标.
输出序列。
2.代码截图
3.PTA提交列表说明
- 本题主要是编译错误,也就是用了c++的语法提交的时候没改成c++所以错了这么多次,最后才发现问题。
题目2:6-4 集合的基本运算(单链表)
1. 设计思路
1.元素的输出就是定义一个结构体指针,用while循环判断p是否为空输出的。
2.创建链表就是定义俩个结构体指针s和r,r指向头结点 L=new LinkList;s用来创建新的链表s=new LinkList;再用尾插法插入后面新建的结点,最后 r->next=NULL;
3.销毁链表和输出链表差别就是多了一个r指针使得要销毁的结点能有标识,然后在用while(p)循环消除。
4.单链表元素递增排序就是先定义俩个指针LinkList p,q;和一个char ch;用来作中间变量,利用冒泡法,交换俩个结点的数据,完成排序。
5.求两有序集合ha、hb的并集hc就是定义俩个指针,然后利用循环 while(pa!=NULL&&pb!=NULL) 比较俩个链表的数据的大小,小的就放入hc中,遇到俩数据相等时,ha数据放入hc中,ha,hb,同时向下移,再判断俩链表是否遍历完,把没遍历完的链表的数据接在hc后,最后r->next=NULL;
6.求两有序集合ha、hb的交集hc定义三个结构体指针,分别指向ha,hb,hc,利用俩层循环遍历链表,找出俩者相同的数据的结点,然后用尾插法插入hc中。
7.求两有序集合ha、hb的差集hc定义三个结构体指针,分别指向ha,hb,hc,利用俩层循环遍历链表,还定义了一个flag变量用来判断hb是否遍历完,如果遍历完则说明hb中没有与此时ha相同的数据,就把ha的数据放入hc中,最后判断hc在遍历完后是否为空,为空就r->next=s;s->data=NULL; s->next=NULL;反之r->next=NULL;
2.代码截图
3.PTA提交列表说明
- 在第一次测试时,Union C:这一栏一直都无法输出,到了这系统就崩溃了,错误在这个这个函数中的一个循环是死循环,找到错误后答案还是错的,然后阅读了下题目给的输出提示和自己的发现,当存在相同数据时,题目只出现了一个,我写的没有删掉另一个,改正过来后就部分正确,看了看提示“交集为空这一栏错误”,然后看了看代码,是缺少判断hc为空的代码,然后就补上了,提交后错更多了,在dev上测试了下,什么都输不出,然后发现输出函数也有问题,看了看书本上的输出函数,改了改,提交后才对了。
题目3:7-3 两个有序序列的中位数
1. 设计思路
建立链表,销毁链表,输出链表数据和其它几题没什么差别,主函数也几乎一样,主要是寻找中位数的函数不同。
定义了结构体指针和辅助变量LinkList *p=L->next;int count=0,k=0;count用来计数,k用来寻找中位数的位置。
首先判断链表是否为空,不为空用while(p) count++;来计算合并后的链表的长度,然后用while(k<((count+1)/2)-1){ k++; p=p->next; }找到中位数数据所在的结点位置,然后输出。
为空输出NULL。
2.代码截图
3.PTA提交列表说明
- 这道题较为简单,前俩次部分错误是错误和空表可以判断,但是正确的无法判断,看了看寻找中为数的函数没发现错误,然后利用输出看看hc有没有输入的错误,发现输入时得到的hc并不是我们所输入的全部,然后看了看建立链表的函数也没发现错误,最后在主函数找到了错误,多了一个 scanf("%d",&number);使得输入的第二行发生了变化,改正后就对了。
二、截图本周题目集的PTA最后排名
- 本次2个题目集总分:225分 PTA总分在200--250分:2分
三、本周学习总结
1.谈谈你本周数据结构学习时间是如何安排,对自己安排满意么,若不满意,打算做什么改变?
- 时间安排:有时间(除了吃饭,吃零食,睡觉,看电影,上课)就学习啊,使得我的学习时间有点少啊。
安排不满意:就算一天除了吃饭、睡觉、上课发现自己其实也没干嘛,特别是英语,都没背,要对自己有个时间规划安排,空出时间来作英语,毕竟马上要考四级了。
2.谈谈你对线性表的认识?
- 线性表包括顺序表和链表,顺序表顾名思义地址是连起来了,链表的地址不连续,靠指针来链接,链表有利于保存数据,它的增加删除等操作会比较容易实现,不用去移动大半个数组,而顺序表在查找指定位置的数据时更为方便。对于某些题目你会发现题目变了,就只需改一下核心的函数,那些基本的函数都不需要去动,这为我们写题剩下了不少的时间,但有的时候又很麻烦比如7-2的题目,用结构体数组写会比用链表简单多了。
3.代码Git提交记录截图
四、阅读代码
- 这道题的代码是PTA中的7-2的代码,功能也就是求两个一元多项式的乘积与和,我推荐它的原因是因为我觉得写这篇代码设计的十分的巧妙,我在写这道题的时候打了100多行代码还没有正确,然而它只用了50几行就完成了。
- 优点1.当然是简短,可读性很强。 2.代码设计的十分的精巧,特别是在存放输入的多项式的函数时指数作为下标,系数作为数组元素,在计算相加和相乘时直接用俩个循环就完成了
for(int i=0;i<b;i++){
scanf("%d%d",&temp1,&temp2);
B[temp2]+=temp1;
for(int j=0;j<a;j++)
A[temp2+Poly[j].ex]+=(temp1*Poly[j].co);//指数相加,系数相乘
}
amazing!!!省去了排序函数。