博客作业2---线性表

一、PTA实验作业(5分)

题目1:7-1 最长连续递增子序列

1. 设计思路

创造顺序表并记录他的长度为maxsize
innt max[maxsize]//保留最大数的所有数
用一个数组保留最大
for(int i=0;i<L->length-1;i++){
遍历数组里面的元素当后面一个结构体的数据小于前面的更新最大数组的大小和长度
比较长度,当长越过原来的数组时就直接替换。
}
完成输出销毁

2.代码截图

3.PTA提交列表说明。


当n为1是没有输出最大数列后更改。

题目2:6-4 集合的基本运算

1.设计思路

//链表元素递增函数(重构链表)
保留链表的表头和第一个节点。
while(r){
//r为原先链表的第二个节点
遍历新链表当数据小于某一个数的后一个节点的数据的时候完成连接,
r=r->next
}
//r为s1链表的工作指针
//p为s2链表的工作指针

//链表并集(二路归并)
while(p&&r)
if(p->data>r->data)
申请空间保留r里面的数据
连接到链表中
r向后移动
else if(p->data<r->data)
申请空间保留p里面的数据
连接到链表中
p向后移动
else
申请空间保留r里面的数据
连接到链表中
r,p都移动
}
完成输出摧毁并集链
while(p){
将p中剩下的节点都用开辟新空间连接节点的方式放到链表去
}
while(r){
将r中剩下的节点都用开辟新空间连接节点的方式放到链表去
}

//链表交集(二路归并)
while(p&&r)
if(p->data>r->data)
r向后移动
else if(p->data<r->data)
p向后移动
else
申请新空间将节点数据保留节点的数据并且连接到链表中去
r,p都移动
}
完成输出摧毁并集链


//链表差集(二路归并)
while(p&&r)
if(p->data>r->data)
r向后移动
else if(p->data<r->data)
申请空间保留p里面的数据
连接到链表中
p向后移动
else
r,p都移动
}
完成输出摧毁并集链
while(p){
将p中剩下的节点都用开辟新空间连接节点的方式放到链表去
}

3.代码截图

4.本题调试过程碰到问题及PTA提交列表情况说明。


在复制,黏贴重复步骤时没有把指针名字更改造成错误

题目3:7-4(选做) 一元多项式求导

2.设计思路

//截取了核心部分求导的函数设计思路
for(遍历整条链表)
if(节点内指数数据为0)时删除这个节点;
else 将链表的节点的zhishu-1 系数变为指数乘以系数

3.代码截图

4.本题调试过程碰到问题及PTA提交列表情况说明。


答案是 0 0 的时候没操作好后来修改了

二、截图本周题目集的PTA提交列表及最后排名。

PTA排名

1.顺序表PTA排名

2.链表PTA排名

3.我的总分:295

三、本周学习总结

1.谈谈你本周数据结构学习时间是如何安排,对自己安排满意么,若不满意,打算做什么改变?(1分)

有时间就打打代码很少看书,觉得应该增加一些书本代码的阅读来改进自己的代码风格。

2.谈谈你对线性表的认识?

线性表、包括顺序表和链表
顺序表里面元素的地址是连续的,
链表里面节点的地址不是连续的,是通过指针连起来的。
链表有利于保存数据(它的增加删除等操作会比较容易)
而顺序表比较适合作为查找数据的目录就像图书馆里面的搜索器。
二者可以相互结合来操作用会比较好一点单一使用二者之一的应用范围我认为比较局限。
例如:我要为一个医院建立一份病人的名单(保留患者信息的那种)
如果我单单使用顺序表去实现查询某个病人的信息确实好操作但是我要是想增加的话就很麻烦
同理我要是只用链表去实现效果相反。
于是有一种可以解决两个问题的方法就是将这些病人的信息随便放然后去记录这些病人的资料所在位置的地址保存在一个顺序表当中去(相当于书本的目录)
根据这些目录所对应的链表节点去找寻一个个病人的信息,当有病人增加的时候就可以去扩展链表并将信息保存在链表去并增加目录信息这样可以打大提高效率
就是用顺序表去建立索引系统,用链表去保留个人信息。

四、阅读代码

题目描述:
在一个周长为10000的圆上等距分布着n个雕塑。现在又有m个新雕塑加入(位置可以随意放),希望所有n+m个雕塑在圆周上均匀分布。这就需要移动其中一些原有的雕塑。要求n个雕塑移动的总距离尽量小。

#include<cstdio>  
#include<cmath>  
  
int main()  
{  
    int n, m;  
    while(scanf("%d%d", &n, &m) == 2)  
    {  
        double ans = 0.0, pos = 0.0;  
        for(int i = 1; i < n; i++)  
        {  
            pos = (double)i / n * (n+m);            //计算每个需要移动的雕塑的坐标(成比例缩小,目的是通过与floor作差得到移动距离~)  
            ans += fabs(pos-floor(pos+0.5)) / (n+m);//累加移动距离  
        }  
        printf("%.4lf\n", ans*10000);               //等比例扩大坐标  
    }  
    return 0;  
}  

分析题目可以知道总是有一个雕塑位置是不动的然后以这个雕塑为定点缩小题目周长的思想把题目简化,最后再放大回来,值得学习的思想。

posted @ 2018-03-24 21:36  这个人有毒啊  阅读(289)  评论(4编辑  收藏  举报