数据结构 第二章学习小结

一、数据结构 第二章知识点

  • 2.1-2.3
    • 2.1 线性表的定义与特点
    • 2.2 案例引入
      • 1.一元多项式的运算:顺序表
      • 2.稀疏多项式的运算:链式表
      • 3.图书信息管理系统:查找/插入/删除等操作
    • 2.3 线性表的类型定义
      • ADT定义
  • 2.4 线性表的顺序表示与实现
    • 1.顺序存储结构(随机存取)
    • 2.基本操作实现算法:初始化/取值/查找/插入/删除
    • 3.补充:
      • 讨论时间复杂度O(n)和空间复杂度S(n),默认是最坏情况下
      • 插入,删除等操作时间复杂度都为O(n):查找第i个元素,时间复杂度为O(1);查找值为x时,时间复杂度为O(n)。
      • 若顺序表长度很大,注意内存分配空间是否足够
  • 2.5 线性表的链式表示和实现
    • 1.链式存储结构(顺序存取)
    • 2..基本操作实现算法:创建/初始化/取值/查找/插入/删除(头插法,尾插法)
    • 3.循环链表(带头尾指针,只带尾指针),双向链表
    • 4.补充
      • 程序退出时回收空间(链表/结点)
      • 创建头结点方便删除/插入等操作
      • 指针作为形参,若修改了指针的直接空间,要加&。若是间接空间,可以不加&。
  • 2.6-2.9
    • 2.6顺序表和链表的比较
      • 顺序表适用于长度变化不大,插入删除操作较少
      • 链表适用于长度变化较大,插入删除操作较多
    • 2.7 线性表的应用
      • 线性表合并(书)
      • 有序表合并(书)
      • 线性表或有序表求交集的ADT定义
        ADT List{
        数据对象: D={ai I ai∈ElemSet, i=1, 2, ..., n, n>=0}
        数据关系: R={ <ai-1, ai>|ai-1, ai∈D, i=1, 2, ..., n}
        基本操作:
        InitList(&L)
        操作结果:构造一个空的线性表 L。ListLength(L)
        初始条件:线性表 L 已存在。
        操作结果:返回 L 中数据元素个数。GetElem(L, i, &e)
        初始条件:线性表 L 巳存在, 且 1<=i<=ListLength(L)。操作结果:用 e 返回 L 中第 1 个数据元素的值。LocateElem(L, e)
        初始条件:线性表 L 已存在。
        操作结果:返回 L 中第 1 个 值与e 相同的元素在 L 中的位置 。若这样的数据元素不存在,则返回值为 0。
        ListInsert(&L, e)
        初始条件:线性表 L 已存在。
        操作结果:将数据元素 e 插入到 L 的最后,L 的长度加 1。
        
        MergeList(LA, LB, &LC)//此说明对应算法 1 初始条件:线性表 LA 和 LB 已存在。
        操作结果:求线性表 LA 与 LB 的交集,结果保存在 LC。MergeList(LA, LB)//此说明对应算法 2
        初始条件:线性表 LA 和 LB 已存在。
        操作结果:求线性表 LA 与 LB 的交集并返回。
        //以上是必须要有的操作(因为等下要用到),其他的自行设计。
        }ADT List
      • 线性表交集
      • //MergeList 算法 1,推荐这种方法
        void MergeList(List LA, List LB, List &LC)
        {//求线性表 LA 与 LB 的交集,结果保存在 LC n = ListLength(LB); //求线性表长度for(i=1; i<=n; i++)
        {
        GetElem(LB, i, e);
        if(LocateElem(LA, e)) //LA 中有和 e 相同的数据元素存在ListInsert(LC, e);//将 e 插入 LC 最后面。
        }
        }
        
        //MergeList 算法 2:
        List MergeList(List LA, List LB)
        {//求线性表 LA 与 LB 的交集并返回List LC; //LC 是局部变量InitList(LC);
        n = ListLength(LB); //求线性表长度for(i=1; i<=n; i++)
        {
        GetElem(LB, i, e);
        if(LocateElem(LA, e)) //LA 中有和 e 相同的数据元素存在ListInsert(LC, e);//将 e 插入 LC 最后面
        }
        return LC;
        }

         

      • 有序表交集
        void MergeList(List LA, List LB, List &LC)
        {//有序表 LA 与 LB 的交集,结果保存在 LC m = ListLength(LA);
        n = ListLength(LB);//求线性表的长度i = j = 1;
        while(i<=m&&j<=n)
        {
        GetElem(LA, i, e1);//将 LA 中第 i 个元素的值赋给 e1 GetElem(LB, j, e2);//将 LB 中第 j 个元素的值赋给 e2 if(e1<e2) i++;
        else if(e1>e2) j++; else
        {
        ListInsert(LC, e1);//e1 与 e2 相同,将 e1 的值插入给 LC 的最后i++;
        j++;
        }
        }
        //循环结束,表示其中一个有序表已遍历完成,求交集结束。
        }

         

    • 2.8 案例分析与实现
    • 2.9 小结
      • 顺序表与链表的比较
      • 单链表,循环链表,双向链表的比

二、心得体会

  • 第二章学习的逻辑结构是线性表,存储结构有顺序存储结构(顺序表)和链式存储结构(链表)。顺序存储结构实例有数组,由于上学期学过,比较好掌握。主要还是链式存储结构,操作比较繁琐抽象,还要考虑不同情况用哪种方法:头插法,尾插法(尾指针是否运用)等等,以及特殊线性表(有序表)怎么充分发挥特点等等。第二章的内容实践性强,需要多花一点时间,代码也需要多复现。
  • 学习第二章时开创了新的学习模式:分组协作代码。这两三周进行了两次小组合作。第一次合作不知道怎么进行,所以我们都是自己先写,然后发出来大家进行修改,但是跟别人沟通后发现别人能够在规定时间内提交,而我们没能完成,效率太低。于是,我们便开始寻找另一种方式:利用一个共同编辑代码的软件:Visual Stadio,合作前先分配好每个人的任务,做得快的可以继续进行编写,最后大家一起进行修改。果然这次提前了较多时间完成。但是后来还是发现尾指针的使用导致某些情况过不了,当时没有发现 ,有点大意。(在第二道分组协作代码里尾指针的使用我们小组成员都有点不明不白,希望老师可以重点讲解。)
  • 最后补充一点:就是回收链表空间,特别包括结点空间!
    void DestroyList(LinkList L)
    {//回收L的所有结点的空间 
        LNode *p = L ;
        LNode *q ;
        while(p)
        {
           q = p->next ;
            delete p ;
            p = q;
        }
    }

三、推荐

  • https://blog.csdn.net/qq_35644234
  • 这是一位在CDSN官网上的博主,写了挺多关于c++,数据结构相关的知识,其中我根据第二章学习比较推荐看的是他文章里的 数据结构--线性表详解(一)、数据结构--线性表详解(二)以及 数据结构--链表的排序详解
  • 他比较详细的讲解了线性表包括顺序表、链式表的基本操作实现以及链表排序的实现,代码不一定完全正确但是可以学习参考。

四、目标

  • 讨论时积极思考回答,对于老师提出的问题不断深究,巩固链表的应用,多打代码,并且好好预习。紧跟老师的步伐,努力学习,加油!
posted @ 2020-04-10 14:59  iiiiiiiiH  阅读(485)  评论(0编辑  收藏  举报