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存在,则修改指针删除之。

  • 相关阅读:
    前端通过ajax请求,调用net core webapi接口
    WeUI——手机验证码
    Docker学习笔记之--安装mssql(Sql Server)并使用Navicat连接测试(环境:centos7)
    Docker学习笔记之-推送镜像到Registrys仓库
    PuppeteerSharp 在asp.net中使用 PuppeteerSharp生命周期管理
    vscode 插件记录下
    angular 项目8升级9 踩坑
    Skoruba.IdentityServer4.Admin 踩坑
    VUE-MATOMO实现埋点
    netcore rpm
  • 原文地址:https://www.cnblogs.com/sanwumanzi/p/10558581.html
Copyright © 2011-2022 走看看