zoukankan      html  css  js  c++  java
  • 数据结构——循环链表

    1、循环链表的定义
    循环链表是一种首尾相连的链表。特点是无需增加存储量,仅对表的链接方式修改使表的处理灵活方便。空循环链表仅由一个自成循环的头结点表示。

    2、单向循环链表

    在单向链表中,头指针是相当重要的,因为单向链表的操作都需要头指针,所以如果头指针丢失或者破坏,那么整个链表都会遗失,并且浪费链表内存空间。
    单向循环链表的构成:如果把单链表的最后一个节点的指针指向链表头部,而不是指向NULL,那么就构成了一个单向循环链表。

    3、双向循环链表

    在单链表L中,查找ai的后继 Next(L, ai),耗时仅为O(1),因为取ai之后继指针即可。但查找ai的直接前驱Prior(L, ai),则需从链表的头指针开始,找到结点ai前一结点即是。故运算Prior(L,ai)依赖表长n,耗时为O(n)。另外,若链表中有一指针值被破坏,则整个链表脱节。这是单链表的不足,为此,引入双向链表。先定义双向链表中的结点:image其中,data和next同单链表,增加一指针域prior,其指向本结点的直接前驱。
    结点描述:
    typedef int data_t;
    typedef struct dnode_t
    { data_tdata;
    struct dnode_t *prior, *next;
    }dlinknode_t, *dlinklist_t;

    a、双向循环链表插入:即实现在表L的第i结点前插入一结点x的运算。
    算法思路:调用查找算法Getlist(L,i),获取结点ai的指针p 。若p存在,申请一q结点,存入元素x,然后修改指针,将q结点插入p结点之前。

    b、双向循环链表删除:即实现删除链表中第i结点的运算。
    算法思路:调用查找算法GetlLinkist(L, i),获取ai的指针p,若p存在,则修改指针删除之。

  • 相关阅读:
    zabbix (2.0.6) 历史记录处乱码
    centos 关闭防火墙
    android 带边框的圆角按钮
    Android开发如何在4.0及以上系统中自定义TitleBar
    Android配置时,点击eclipse里Window->Preferences里的android选项出错
    .net 内存泄露检测工具
    UVA 548 Tree
    UVA 536 Tree Recovery
    UVA 514 Rails
    UVA 442 Matrix Chain Multiplication
  • 原文地址:https://www.cnblogs.com/sanwumanzi/p/10558581.html
Copyright © 2011-2022 走看看