博客作业2---线性表

一、PTA实验作业

1.题目1:线性表元素的区间删除

2. 设计思路

    定义整型变量i,j用于循环进行,变量n用于记录顺序表元素的个数;
    j与n初始为0;
    for i=0 to L->Last
    {
        if L->Data[i]在需要删除的区间外
            重新保存进线性表
        else
            n++;
     }
     L指向的最后一个元素的位置减去n;
    返回L;

3.代码截图

4.PTA提交列表说明

  • 一开始将顺序表和链表的操作弄错了,写成“L->Data[i]=L->Data[i+1]”,导致程序全部错误,后来重新用顺序表的方式处理数据,顺序表的操作类似数组(“编译错误”的原因忘记了)。

1.题目2:链表倒数第m个数

2. 设计思路

    定义循环变量i,定义整型变量n记录链表长度;
    定义p指针指向L头结点;
    while p->next不为空        //计算链表长度
    {
        n++;
        p指向下一节点;
    }
    if m<=0或n-m+1<=0//位置非法
        返回-1;
    p=L;       //结点位置重置
    while i<=n-m且p不为空     //找第n-m个元素 
    {
        i++;
        p指向下一节点;
    }
    if p不为空
        返回 p->data;

3.代码截图

4.PTA提交列表说明

  • 在定义p时不确定是“p=L->next”还是“p=L”,以及第一层循环的判断条件在“p->next!=NULL”与“p!=NULL”之间徘徊,还有当输入非法位置时缺少判断,后面不上了这一点,虽然一开始思路是对的,但是一些细节部分没有考虑处理好。

1.题目3:两个有序序列的中位数

2. 设计思路

    /*找中位数的函数*/
    定义整型变量i=0,mid;
    定义指针p指向L1->next,q指向L2->next;
    while p不为空且q不为空
    {
        if p->data小于q->data
        {
            i++;
            if i等于中间位置的序号
                那么 mid 等于p所包含的数据;
                        返回 mid;
            else p指向下一节点;
        }
        else
        {
            i++;
            if i等于中间位置的序号
                那么 mid 等于q所包含的数据;
                        返回 mid;
            else q指向下一节点;
        }
    }

3.代码截图




4.PTA提交列表说明

  • 一开始使用的是头插法建表,但发现输出的数据是相反的,于是改成尾插法。
  • 运行的时候提醒错误,我没有考虑如果两个链表刚好是首尾衔接的情况,程序运行异常,于是修改了判断条件。
  • 最后运行的时候还是提示错误“最大N”和“最小N”,不停地测试数据,在发现输入“1 0 1”却输出为空时以为是这个错了,但是修改后PTA还是报错,实在找不出来了。

二、截图本周题目集的PTA最后排名

本次2个题目集总分:295分

1.顺序表PTA排名

2.链表PTA排名

3.我的总分:176

三、本周学习总结

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

这一周因为有两个物理实验再加上晚上和周末还要去上课,课余时间比较少,导致我周三才开始写PTA,到今天还在挣扎着看能不能多做几题(但是真的太难了〒▽〒),尽管是因为时间少,我还是对这周的学习不满意,不能做到各科均衡,这几天忙着写代码又把其他科目给放下了,这样子明显很不行,所以要改变一下学习计划↓

  • 每次上课前一定要做好预习,不一定能做到把书上例题看完看懂,但至少要知道这节课要讲什么内容;
  • 其实可以拿个本子,在做课堂派、PTA的时候可以随时把自己不懂的、错的点记下来,以及改正的方法--->数据结构学习笔记(〃'▽'〃)
  • 还有不能局限于课本的代码,要多看些优秀的代码,有助于自己理解代码写代码,这也是为什么老师一直推荐我们去找代码看,所以计划一天看一个代码,当然不是每天都会记得,所以一周至少看4个代码,对这些看过的代码也要做个记录。

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

线性表是一种逻辑结构,而不是某种特定的实现,线性表的实现方式有很多种,如顺序表,单链表,双向链表,循环链表,有序表等,但是都各有各的特点。

  • 顺序表:顺序表可以随机存储,对存储空间的利用率高,访问元素也很快,时间复杂度为O(1),但是顺序表的插入需要移动大量的元素,时间复杂度为O(n)。

  • 单链表:链表的每一个结点除了保存需要存储的数据外,还需要保存逻辑上相邻的下一个结点的地址。链表由n个类型相同的结点通过指针链接形成线性结构。结点由数据域和指针域组成。数据域用于存储结点代表的数据,指针域存储结点的后继结点地址。链表不支持随机访问。有n个结点的线性表,访问某个结点的平均时间复杂度为O(n/2),最坏为O(n) 。而数组支持随机访问,他的访问时间复杂度为O(1)。

    • 插入和删除操作无需移动元素,只需修改结点的指针域。这点恰巧是顺序表(如ArrayList和数组)的缺点。

    • 使用链表访问元素时,不支持随机访问。访问第n个数据元素,必须先得到第n-1个元素的地址,因此访问任何一个结点必须从头结点开始向后迭代寻找,直到找到这个目标结点为止。

  • 循环单链表:最后的一个结点的指针域指向头结点。

    • 遍历结束的标志是 p == 【头结点地址】,而不是p==NULL

    • 表为空的判断标志是: if( head->next == head )

    • 在单循环链表中,从任一结点出发都可访问到表中所有结点

  • 双向链表:双向链表的结点有2个指针域:prior 和 next。next同样保存下一个结点的指针,而结点新增的成员prior则用来保存前一个结点的地址。

    • 双向链表比单链表更占空间,因为每个结点多了一个指针域。

    • 操作也更复杂。

3.代码Git提交记录截图

(弄了好几天才成功= =)

posted @ 2018-03-25 22:22  看尽长安花  阅读(247)  评论(0编辑  收藏  举报