zoukankan      html  css  js  c++  java
  • 数据结构——线性表

    0.PTA得分截图

    1.本周学习总结

    1.1 线性表内容总结

    1.1.1顺序表结构体

    1.1.1.1定义

    #define MaxSize 100
    struct student
    {
       int data[maxsize];
       int length;           //记录顺序表最后一个数据的位置
    }
    
    如上代码定义了一个最大数据存储量为101的顺序表结构体。
    

    1.1.1.2顺序表插入

    现在假设已有顺序表S,要将数据x插入至第p个位置
    伪代码

    if p大于length
       S->data[p-1]赋值为x
    else p小于length
       for length to p
       数组后移一位
       S->data[p-1]赋值为x
      
    

    代码

    if(p>length)
    {
       s->data[p]=x;
    }
    else
    {
       for(i=length;i>=p;i--)
       {
          s->data[i]=s->data[i-1];
       }
       s->data[p-1]=x;
    }
    

    1.1.1.3顺序表数据删除

    现在假设已有顺序表S,要将第p个位置的数据删除
    伪代码

    if p大于length
       删除位置无效,返回false
    else p小于length
       for p-1 to length-1 
       数组前移一位
    

    代码

    if(p>length)
    {
       return false;
    }
    else
    {
       for(i=p-1;i<=length-1;i++)
       {
          s->data[i]=s->data[i+1];
       }
    }
    

    1.1.2链表结构体定义

    实例:PTA线性表题目集7-1

    1.1.2.1头插法

    伪代码

    建立新空列表,头指针为L
    for i=1 to i<=n
    {
      建立新节点Node
      Node->next指向L->next
      L->next指向Node
    }
    

    实例:PTA线性表题目集6-5头插法建链表

    1.1.2.2尾插法

    伪代码

    建立新空链表,头指针为L
    前驱指针为pre指向L
    for i=1 to i<=n
    {
      建立新节点Node
      Node->next指向pre->next
      pre->next指向Node
      pre指向下一个节点
    }
    

    实例:PTA线性表题目集6-6尾插法建链表

    1.1.2.3链表插入

    伪代码

    通过前驱指针pre遍历链表找到插入点
    新建节点Node
    Node->next指向pre->next
    pre->next指向Node
    pre指向其下一个节点pre->next
    

    实例:PTA线性表题目集6-10有序链表的插入和删除

    1.1.2.4删除操作

    伪代码

    通过前驱指针pre遍历链表找到插入点
    temp指向pre->next
    pre->next指向pre->next->next,即更后一个节点
    删除 temp
    

    实例:PTA线性表题目集6-10有序链表的插入和删除

    1.1.3有序表

    1.1.3.1有序单链表数据插入和删除

    同上!!!!同上!!!!

    1.1.3.2有序表合并

    假设现有两个数据递减的有序表L1和L2,将其有序合并且延用L1的头节点
    法一:借助数组

    • 新建数组A[]将L1和L2的所有数存入其中
    • 运用冒泡排序法或者选择排序法将其处理为有序
    • 将排序后的A[]的所有数据存进链表,并把L1作为节点
      图示:

    法二:借助L3

    • 新建链表L3
    • 将L1和L2中节点数据逐个比较
    • 较大的数赋值到新建节点Node插入L3
    • 将L3替换为L1,即延用L1作为头节点
      图示

    法三:直接法(推荐)

    • L1作为主链被比较
    • 若L2中节点数据找到L1中第一个比它小的数据便插在其前端
    • L1若阅尽则L2未比较元素按顺序接到L1后面
      图示

      推荐原因:时间复杂度最小,为O(n);不需要占用新的空间,空间复杂度最小,为O(1)

    1.1.4特殊链表

    1.1.4.1循环链表

    1.1.4.2双链表


    节点的插入

    s->next=p->next;
    p->next->prior=s;
    s->prioe=p;
    p->next=s;
    

    节点的删除

    temp=p->next;
    p->next->next->prior=p;
    p->next=p->next->next;
    delete temp;
    

    1.2谈谈你对线性表的认识及学习体会。

    线性表即是一条在计算机中牢固的关系绳子。对于顺序表来说,上学期对数组的掌握够扎实便可轻松应付;而对于链表,操作难度更高,数据存储更灵活,抽象思维的要求需要更强,基本的链表插入,删除,排序的代码需要多加训练才能熟练编写,更值得一提的是,要学会画链表操作示意图来帮助我们寻找解决问题的方法

    2.PTA实验作业(0-2分)

    选3道PTA题目,不写伪代码,只贴代码截图,并记录代码提交碰到问题及解决方法。必须选择线性结构应用题目,不得选操作集类似题目,头插法、尾插法、链表逆转也不得选。(选,则为0分)选择难度越高题目得分越高。

    2.1.题目1:链表分割

    2.1.1思路图

    2.1.2代码截图

    2.1.3PTA提交列表说明

    Q1:考虑了跳跃式移动的方式遍历L1(pre指针一直指向数列an的各个数据),写好代码后发生了段错误。
    A1:仔细检查发现原来是用辅助指针将bn的数据接入L2时,忘记记录下一个数据的位置,即忘记让pre=pre->next,补上后得到解决。
    Q2:再次提交依然是段错误,仔细检查代码后发现没有什么错误。
    A2:后来试图从题目入手,检查提给信息是否遗漏,仔细看样例,发现L1的最后一个数据节点不一定是bn,而有可能是an,所以我在遍历L1的循环中加入了另外一个退出循环的条件,即pre->next==NULL,又在其下面加了一个if语句判断最后一个数据是an还是bn

    2.2 题目2:7-2 一元多项式的乘法与加法运算

    2.2.1 思路图

    乘积


    2.2.2代码截图

    乘积


    2.2.3PTA提交列表说明


    Q1:忘记考虑0多项式的情况
    A1:当L1或者L2数据相乘时,两个数据只要其中一个的系数为0,直接将其结果的系数和指数赋值为0
    Q1:在vs中代码测试发现不管怎样,关于两个多项式的乘法得到最后的结果总会少掉最后一项,求和没问题。
    A1:奈何能力有限,调试了好几个小时也没办法!!!!

    2.3 题目3:链表倒数第m个数

    2.2.1思路图

    思路一:

    思路二:

    2.2.2代码截图

    2.2.3提交列表及说明


    Q1:段错误:我的代码体现的方法是思路一,即先遍历链表求长度,记录在count。
    A1:发现我的循环pre走到NULL时多记录一次长度,即把NULL都算进去了,导致我输出某个结果时非法访问空间了,我在下面加上一个count--,问题得到解决
    Q2:解决问题一后提交发现,测试点有三个,分别是一个有效情况,两种无效情况,我有一种无效情况测试点产生了段错误,而我将空链表的情况和m比count大的情况已经考虑了,所以不知道哪里还有错。
    A1:后来仔细想了想,如果m是负数或者0呢,我将m<=0加入到if判断中,提交后得到解决

    3.阅读代码(0--4分)

    找2份优秀代码,理解代码功能,并讲出你所选代码优点及可以学习地方。主要找以下类型代码:
    考研题种关于线性表内容。可以找参加过考研的学长学姐拿。尤其是想要考研同学,可以结合本章内容,用考研题训练学习。
    ACM题解
    leecode面试刷题网站,找线性表相关题目阅读分析。
    leecode经典题目
    注意:不能选教师布置在PTA的题目。完成内容如下。
    3.1 题目及解题代码
    可截图,或复制代码,需要用代码符号渲染。
    3.1.1 该题的设计思路
    链表题目,请用图形方式展示解决方法。同时分析该题的算法时间复杂度和空间复杂度。
    3.1.2 该题的伪代码
    文字+代码简要介绍本题思路
    3.1.3 运行结果
    网上题解给的答案不一定能跑,请把代码复制自己运行完成,并截图。
    3.1.4分析该题目解题优势及难

  • 相关阅读:
    puttytray
    让程序同时输出到文件与屏幕(tee)
    R将文件转化为矩阵
    gnome3下gedit乱码的解决方案
    perl随机打乱数组
    gnome 3.6
    google earth 离线下载地址
    wget 使用技巧
    运行pindel注意事项
    获取当前行号与列号
  • 原文地址:https://www.cnblogs.com/243050cz/p/12444339.html
Copyright © 2011-2022 走看看