精华内容
下载资源
问答
  • 循环链表与单链表的主要差异当链表遍历时,判别当前指针p是否指向表尾结点的终止条件不同。在单链表中,判别条件为p!=NULL或p->next!=NULL,而循环单链表的判别条件为p!=L或p->next!=L。 算法的复杂度O(1)...

    循环链表

    循环链表是头尾相接的链表(即表中最后一个结点的指针域指向头结点,整个链表形成一个)(circular linked list)

    img

    • 优点:从表中任一结点出发均可访问全部结点

    循环链表与单链表的主要差异当链表遍历时,判别当前指针p是否指向表尾结点的终止条件不同。在单链表中,判别条件为p!=NULL或p->next!=NULL,而循环单链表的判别条件为p!=L或p->next!=L。

    img
    img

    img
    img

    算法的复杂度O(1)(常数阶)

    双向链表

    img
    为了克服单链表的这一缺点,老科学家们设计了双向链表(double linked list)是在单链表的每个结点中再设计一个指向其前驱结点的指针域。所以在双向链表中的结点有两个指针域,一个指向直接后继,另一个指向直接前驱。这样链表中有两个不同方向的链。

    img

    img

    img

    与单循环链表类似双向链表也可以有循环表(首尾相接形成"环"[2个])
    让头结点的前驱指针指向链表的最后一个结点
    最后一个结点的后继指针指向头结点

    img

    双向链表结构有对称性(设指针p指向某一个结点)
    p->prior->next=p=p->next->prior(前进一步后退一步相当于原地踏步)

    img

    在双向链表中有些操作(ListLength,GetElemment等因为只涉及一个方向的指针他们的算法与线性表的相同)但在插入和删除需要修改两个方向上的指针两者的算法复杂度均为O(n)

    [算法2.13]双向链表的插入

    带头结点的双向链表L中第i个位置之前(b)插入前插入一个新结点

    img

    img

    单链表只需修改两个指针,而双向链表修改四个指针

    算法复杂度O(n)

    img

    img

    算法复杂度O(n)

    小结

    • 优点:

      • 结点空间可以动态申请和释放;
      • 数据元素的逻辑次序靠结点的指针来指示,插入和删除不需要移动元素。
    • 链式存储结构的缺点:

      • 存储密度小,每个结点的指针域需额外占用存储空间。当每个结点的数据域所占的字节数不多时,指针域所占的存储空间的比重显得很大。
      • 存储密度是指结点数据本身占用的空间**/结点占用的空间总量**

    img

    链式存储结构是非随机存取结构。对任一结点的操作都要从头指针依指针链查找到该结点,这增加了算法的复杂度。(对某个结点操作一般要先找到该结点)

    链式存储结构是非随机存取结构。对任一结点的操作都要从头指针依指针链查找到该结点,这增加了算法的复杂度。(对某个结点操作一般要先找到该结点)

    img

    展开全文
  • 单链表和循环链表

    2015-07-30 14:50:34
    使用链表进行存储元素的时候具有插入和删除节点效率高的优点,这里主要介绍插入和删除元素时的步骤: 一 单链表的插入和删除 在节点p之后插入一个新的节点s,如下图所示: ...二 循环链表的插入和删除 循环

    使用链表进行存储元素的时候具有插入和删除节点效率高的优点,这里主要介绍插入和删除元素时的步骤:

    一 单链表的插入和删除

    在节点p之后插入一个新的节点s,如下图所示:


    步骤如下:先连右手,后连左手。

    s->next=p->next;

    p->next=s;

    在p节点之后删除s节点:


    步骤如下:

    p->next=s->next;

    二 循环链表的插入和删除

    循环链表的插入,如下图所示:


    步骤如下,注意不要记错顺序:

    s->prior=p;

    s->next=p->next;

    p->next->prior=s;

    p->next=s;



    展开全文
  • //不带头节点的链表,主要应用在循环链表中,其缺点,操作复杂(会出现二级指针), //优点:灵活(头指针指向哪个节点哪个节点就是第一个节点) //不带头节点的单链循环链表,尾节点的next指向第一个节点 typedef struct N...

    创建头文件nlist.h

    #pragma once
    //不带头节点的链表,主要应用在循环链表中,其缺点,操作复杂(会出现二级指针),
    //优点:灵活(头指针指向哪个节点哪个节点就是第一个节点)
    //不带头节点的单链循环链表,尾节点的next指向第一个节点
    
    typedef struct NNode
    {
     int data;//数据
     struct NNode *next;//下一个节点的地址
    }NNode,*PNList;
    
    //初始化函数,将头指针置NULL,会出现二级指针
    void InitList(PNList *pplist);
    
    //头插,需要修改头指针,会出现二级指针
    bool Insert_head(PNList *pplist,int val);
    
    //尾插,有可能需要修改头指针,会出现二级指针
    bool Insert_tail(PNList *pplist,int val);
    
    //在plist中查找关键字key,找到返回下标,失败返回NULL
    NNode * Search(PNList plist,int key);
    
    //判空
    bool IsEmpty(PNList plist);
    
    //删除plist中的第一个key,有可能需要修改头指针,会出现二级指针
    bool DeleteVal(PNList *pplist,int key);
    
    //获取数据长度
    int GetLength(PNList plist);
    
    //输出所有数据
    void Show(PNList plist);
    
    //清空数据,需要修改头指针,会出现二级指针
    void Clear(PNList *pplist);
    
    //销毁动态内存,需要修改头指针,会出现二级指针
    void Destroy(PNList *pplist);

    创建nlist.cpp文件

    #include <stdio.h>
    #include <stdlib.h>
    #include <assert.h>
    #include "nlist.h"
    
    //初始化函数,将头指针置NULL,会出现二级指针
    void InitList(PNList *pplist)
    {
     assert(pplist != NULL);
     if(pplist == NULL)
      return;
      
     *pplist = NULL;
    }
    
    //头插,需要修改头指针,会出现二级指针
    bool Insert_head(PNList *pplist,int val)
    {
     NNode *p = (NNode *)malloc(sizeof(NNode));
     p->data = val;
     if(IsEmpty(*pplist))
     {
      p->next = p;
      *pplist = p;
     }
     else
     {
      NNode *q;//找尾巴
      for(q=*pplist;q->next!=*pplist;q=q->next);
      p->next = *pplist;
      *pplist = p;
      q->next = p;
     }
     
     return true;
    }
    
    //尾插,有可能需要修改头指针,会出现二级指针
    bool Insert_tail(PNList *pplist,int val)
    {
     NNode *p = (NNode *)malloc(sizeof(NNode));
     p->data = val;
     if(IsEmpty(*pplist))
     {
      p->next = p;
      *pplist = p;
     }
     else
     {
      NNode *q;//找尾巴
      for(q=*pplist;q->next!=*pplist;q=q->next);
      q->next=p;
      p->next=*pplist;
     }
     
     return true;
    }
    
    //在plist中查找关键字key,找到返回节点,失败返回NULL
    NNode * Search(PNList plist,int key)
    {
     NNode *q;
     for(q=plist;q->next!=plist;q=q->next)
     {
      if(q->data==key)
      {
       return q;
      }
     }
     if(q->data==key)
     {
      return q;
     }
     
     return NULL;
    }
    
    //判空,判断plist是否为NULL
    bool IsEmpty(PNList plist)
    {
     return plist == NULL;
    }
    
    //删除plist中的第一个key,有可能需要修改头指针,会出现二级指针
    bool DeleteVal(PNList *pplist,int key)
    {
     if(IsEmpty(*pplist))
     {
      return false;
     }
     NNode *p;
     NNode *q;
     for(q=*pplist;q->next!=*pplist;q=q->next)
     {
      if(q->next->data==key)
      {
       p=q->next;
       q->next=q->next->next;
       free(p);
       
       return true;
      }
     }
     
     p=*pplist;
     if(p->data==key)
     {
      *pplist=p->next;
      q->next=*pplist;
      free(p);
      
      return true;
     }
     
     return false;
    }
    
    //获取数据长度
    int GetLength(PNList plist)
    {
     int count=1;
     for(NNode *q=plist;q->next!=plist;q=q->next)
     {
      count++;
     }
     return count;
    }
    
    //输出所有数据
    void Show(PNList plist)
    {
     if(IsEmpty(plist))
      return ;
     NNode *p=plist;
     for(;p->next!=plist;p=p->next)//bug
     {
      printf("%d ",p->data);
     }
     printf("%d \n",p->data);
    }
    
    //清空数据,需要修改头指针,会出现二级指针
    void Clear(PNList *pplist)
    {
     *pplist=NULL;
    }
    
    //销毁动态内存,需要修改头指针,会出现二级指针
    void Destroy(PNList *pplist)
    {
     NNode *p;
     NNode *q=*pplist;
     while(q->next!=*pplist)
     {
      p=q->next;
      q->next=p->next;
      free(p);
     }
     *pplist=NULL;
    }
    展开全文
  • 线性链表

    2017-10-27 14:58:14
    静态链表的初始长度一般是固定的,在做插入和删除操作时,不需要移动元素,仅需要修改指针,故仍具有链式存储结构的主要优点;一般在没有指针的语言中,静态链表是数组实现链表的一种方法 2.循环链表和双向链表的...

    1.静态链表有什么优点?适用哪些地方?

    静态链表的初始长度一般是固定的,在做插入和删除操作时,不需要移动元素,仅需要修改指针,故仍具有链式存储结构的主要优点;一般在没有指针的语言中,静态链表是数组实现链表的一种方法

    2.循环链表和双向链表的优点在哪

    双向链表由于另外存储了指向链表内容的指针,并且可以会修改相邻的结点,有时候第一个结点可能会被删除,或者在之前添加一个新的结点,这时候就要修改指向首个节点的指针。 
    有一种可以消除这种特殊情况的方法是在最后一个节点之后,第一个结点之前储存一个永远不会被删除或移动的虚拟结点,形成循环链表。这个虚拟结点之后的结点是真正的第一个结点,这种情况通常可以用这个虚拟结点直接表示这个链表

    3.双向链表删除元素时操作顺序能不能反了

    只要在改动前把指针成员把指针成员保存在一个临时变量里就可以了,随便先改哪个都无所谓。

    4.线性表基本操作

    InitList(*L): 初始化操作,建立一个空的线性表L

    ListEmpty(L): 判断线性表是否为空表,若线性表为空,返回true,否则返回false

    ClearList(*L): 将线性表清空。 GetElem(L,i,*e): 将线性表L中的第i个位置元素值返回给e

    LocateElem(L,e): 在线性表L中查找与给定值e相等的元素,如果查找成功,返回该元素在表中序号表示成功;否则,返回0表示失败。

    ListInsert(*L,i,e): 在线性表L中第i个位置插入新元素e

    ListDelete(*L,i,*e): 删除线性表L中第i个位置元素,并用e返回其值。

    ListLength(L): 返回线性表L的元素个数。

    对于不同的应用,线性表的基本操作是不同的,上述操作是最基本的。

    对于实际问题中涉及的关于线性表的更复杂操作,完全可以用这些基本操作的组合来实现。

    5.什么是指针域

    链式存储结构中,除了要存储数据元素信息外,还要存储它的后继元素的存储地址(指针)。

    也就是说除了存储其本身的信息外,还需存储一个指示其直接后继的存储位置的信息。

    我们把存储数据元素信息的域称为数据域,把存储直接后继位置的域称为指针域。

    6.链式存储结构的线性表

    前面我们讲的线性表的顺序存储结构,它最大的缺点就是插入和删除时需要移动大量元素,这显然就需要耗费时间。

    那我们能不能针对这个缺陷或者说遗憾提出解决的方法呢?要解决这个问题,我们就得考虑一下导致这个问题的原因!

    为什么当插入和删除时,就要移动大量的元素?

    原因就在于相邻两元素的存储位置也具有邻居关系,它们在内存中的位置是紧挨着的,中间没有间隙,当然就无法快速插入和删除。

    线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素,这组存储单元可以存在内存中未被占用的任意位置。

    也就是说,链式存储结构的线性表由一个(可以使零)或者多个结点(Node)组成。每个节点内部又分为数据域和指针域(链)。数据域存储了数据元素的信息。指针域存储了当前结点指向的直接后继的指针地址。

    因为每个结点只包含一个指针域,所以叫做单链表。顾名思义,当然还有双链表

    7.什么是单链表

    指针域中存储的信息称为指针或链。

    这两部分信息组成数据元素称为存储映像,或称为结点(Node)

    n个结点链接成一个链表,即为线性表(a1, a2, a3, …, an)的链式存储结构。

    因为此链表的每个结点中只包含一个指针域,所以叫做单链表

    展开全文
  • 线性表之链表

    2021-01-01 21:07:57
    目录概念分类单向、双向带头、不带头循环、非循环无头单向非循环链表带头双向循环链表链表的实现单向带头非循环双向带头循环链表优缺点优点缺点单链表相关的面试题 概念   链表是一种逻辑结构上连续,物理存储结构...
  • 链表结构

    2018-02-27 15:17:26
    链表是一种和数组同级的数据结构。Java中的ArrayList,...根据指针域的不同,链表分为单向链表、双向链表、循环链表、多向表(网状表)。链表的优缺点:(主要是和数组比较的得出的)优点:1、物理储存单元上非连...
  • 双向链表原理

    2019-08-16 09:35:18
    双向链表主要优点是对于任意给的结点,都可以很轻易的获取其前结点和后结点,其主要缺点是每个结点需要保存next和prev两个属性,因此需要更多的空间开销,同时结点的插入与删除操作也将更加耗时,因为...
  • 自己理解链表的原理

    2021-04-01 11:25:18
    自己理解链表的原理 链表是一系列的存储数据...链表数据结构中主要包含单向链表、双向链表及循环链表优点: 1、插入、删除灵活 (不必移动节点,只要改变节点中的指针,但是需要先定位到元素上)。 2、有元素才会分
  • 顺序表与链表

    2020-08-14 17:58:09
    定义与特点 线性表定义:由0个或多个数据元素组成的有限序列。 顺序表:线性表的顺序存储结构...顺序存储结构的主要优点是节省存储空间,因为数据结点之间的逻辑关系没有占用额外的存储空间。另一个优点是可实现对结点
  • 链表:主要运用2种,A单向不带头结点的非循环链表 B双向带头结点的循环链表 特点是,由程序员手动开辟空间,存放在堆上。 频繁的插删时,应该使用链表。   以链表代码为例 结构体: t...
  • 上一篇博文中主要总结线性表中的链式存储结构实现,比如单向链表、循环链表,还通过对比链表和顺序表的多项式的存储表示,说明链表的优点。可以参看上篇博文...
  • list容器完成的功能实际上和数据结构中的双向链表有点一样,list中的数据元素是通过链表指针串连成逻辑意义上的线性表,也就是list具有链表主要优点,即:在链表的任一位置进行元素的插入、删除操作都是快速的。...
  • vector容器和list容器时STL中最常使用的两个容器,两者之间最大的区别在于它们底层实现的不同,vector的底层实现是基于数组,而list的底层实现是基于双向循环链表。 (list底层结构示意图) 由于vector容器和list...
  • 数据结构知识点汇总

    万次阅读 多人点赞 2018-07-18 15:44:21
    1、用链表表示线性表的优点是(便于插入和删除操作) 2、单链表中,增加头结点的目的是(方便运算的实现) 3、栈和队列的共同特点是(只允许在端点处插入和删除元素) ...7、循环链表主要优点是(从表中任一结点...
  • PAGE PAGE 1 [模拟] 计算机二级(JAVA)笔试7 一选择题(每小题2分共70分) 下列各题[A][B][C][D] 四个选项中只有一个选项是正确的 第1题 循环链表主要优点是 A.不再需要头指针了 B.从表中任一结点出发都能访问到整个...
  • 第一部分 栈和队列的共同特点是... 所需空间与线性表长度成正比 用链表表示线性表的优点是便于插入和删除操作 在单链表中增加头结点的目的是方便运算的实现 循环链表主要优点是从表中任一结点出发都能访问到整个链表
  • 第一部分 1. 栈和队列的共同特点是只允许在端点处插入和删除元素 2. 栈通常采用的两种存储结构是线性存储结构和链表存储结构 3. 链表不具有的特点是 B A. 不必事先估计存储空间 B.... 循环链表主要优点
  • 各个数据结构的优劣

    2019-09-24 03:10:59
    1、链表优点: 可以方便的进行插入,删除操作,可以动态扩充链表, 缺点:空间和时间额外耗费较大,查找操作不方便 通常链表每一个元素都要保存一个指向下一个元素的指针(单链表)。...链表主要应...
  • 循环链表主要优点是 _- 线性表的顺序存储结构和线性表的链式存储结构分别是 _ 13. 树是结点的集合它的根结点数目是 _ 14. 在深度为 5 的满二叉树中叶子结点的个数为 _ 15. 具有 3 个结点的二叉树有 _ 16. 设一棵...
  • 循环链表主要优点是 _- 12. 线性表的顺序存储结构和线性表的链式存储结构分别是 _ 13. 树是结点的集合它的根结点数目是 _ 14. 在深度为 5 的满二叉树中叶子结点的个数为_ 15. 具有 3 个结点的二叉树有 _ 16. 设一...
  • 1、用链表表示线性表的优点是(便于插入和删除操作) 2、单链表中,增加头结点的目的是(方便运算的实现) 3、栈和队列的共同特点是(只允许在端点处插入和删除元素) ...7、循环链表主要优点是(从表...
  • 数组结构

    2019-12-24 18:16:39
    1、用链表表示线性表的优点是(便于插入和删除操作) 2、单链表中,增加头结点的目的是(方便运算的实现) 3、栈和队列的共同特点是(只允许在端点处插入和...7、循环链表主要优点是(从表中任一结点出发都能访问...
  • 数据结构知识点总结(一)

    千次阅读 2018-11-06 15:22:30
    1、用链表表示线性表的优点是(便于插入和删除操作) 2、单链表中,增加头结点的目的是(方便运算的实现) 3、栈和队列的共同特点是(只允许在端点处插入和...7、循环链表主要优点是(从表中任一结点出发都能访问...
  • 1、用链表表示线性表的优点是(便于插入和删除操作) ...7、循环链表主要优点是(从表中任一结点出发都能访问到整个链表) 8、线性表(除了第一个和最后一个元素外,其余每个元素都有一个直接前驱和直接后继)
  • 大数据技术与应用资源库数据结构C语言版主讲人章万静目录E卷判断题分析 试题分析1健壮的算法不会因非法的输入数据而出现莫名其妙的状态 答案 试题分析2循环链表主要优点是从表中任一结点出发都能扫描到整个链表 ...
  • list容器完成的功能实际上和数据结构中的双向链表是极其相似的,list中的数据元素是通过链表指针串连成逻辑意义上的线性表,也就是list也具有链表主要优点,即:在链表的任一位置进行元素的插入、删除操作都是快速...
  • 链式存储结构是基于指针(Java中用对象的引用来表示指针)实现的,存储方式是给每个...链表主要有单链表、单循环链表和循环双向链表三种。 和顺序表一样,只要是线性表肯定方法是共通的只是实现方式不一样,所以我们还
  • 3,单循环链表主要优点是 从表的任意一处出发都能扫描到整个链表。 4,链表不具有的特点是 可随机访问任意元素 5,若某线性表中最常用的操作是取第i 个元素和找第i个元素的前趋,则采用( 顺序表 )存...

空空如也

空空如也

1 2 3 4
收藏数 61
精华内容 24
关键字:

循环链表主要优点