C语言数据结构之双向循环链表的实例

C语言数据结构之双向循环链表的实例

什么是双向循环链表?

双向循环链表是一种链式存储结构。每个节点都包含两个指针域,分别指向前一个节点和后一个节点,形成一个环形结构。双向循环链表可以实现正向和反向遍历,插入和删除节点的时间复杂度为$O(1)$。

双向循环链表的结构体定义

typedef struct Node
{
    ElemType data;
    struct Node *prev;
    struct Node *next;
} Node, *ListNode;

Node表示链表中的一个节点,ElemType为节点中存储的元素的类型。prev和next分别表示指向前一个节点和后一个节点的指针。

双向循环链表的初始化

ListNode initList()
{
    ListNode head = (ListNode)malloc(sizeof(Node));
    head->prev = head->next = head;
    return head;
}

initList()函数用于初始化双向循环链表,在头节点位置分配一个节点空间后,将前驱指针和后继指针都指向头节点,表示链表为空。

双向循环链表的插入

插入在链表头部

void insertHead(ListNode head, ElemType elem)
{
    ListNode node = (ListNode)malloc(sizeof(Node));
    node->data = elem;
    node->next = head->next;
    node->prev = head;
    head->next->prev = node;
    head->next = node;
}

insertHead()函数用于在链表头部插入一个元素。新建一个节点,将节点值赋为elem,将节点的next指向头节点的next,节点的prev指向头节点,然后将头节点的next和头节点的next的prev都指向新节点。

插入在链表尾部

void insertTail(ListNode head, ElemType elem)
{
    ListNode node = (ListNode)malloc(sizeof(Node));
    node->data = elem;
    node->prev = head->prev;
    node->next = head;
    head->prev->next = node;
    head->prev = node;
}

insertTail()函数用于在链表尾部插入一个元素。新建一个节点,将节点值赋为elem,将节点的prev指向头节点的prev,节点的next指向头节点,然后将头节点的prev和头节点的prev的next都指向新节点。

双向循环链表的删除

void deleteNode(ListNode head, ElemType elem)
{
    ListNode cur = head->next;
    while (cur != head)
    {
        if (cur->data == elem)
        {
            cur->prev->next = cur->next;
            cur->next->prev = cur->prev;
            free(cur);
            return;
        }
        cur = cur->next;
    }
}

deleteNode()函数用于删除数据域为elem的节点,遍历链表找到要删除的节点,将这个节点的前一个节点的next指针指向这个节点的后一个节点,同时将这个节点的后一个节点的prev指针指向这个节点的前一个节点。最后释放这个节点的空间。

示例说明

示例一

初始化一个双向循环链表,插入5个元素,分别为1,2,3,4,5。然后从头节点开始遍历链表,输出每个节点的值。

int main()
{
    ListNode list = initList();
    for (int i = 1; i <= 5; i++)
    {
        insertTail(list, i);
    }
    ListNode cur = list->next;
    while (cur != list)
    {
        printf("%d ", cur->data);
        cur = cur->next;
    }
    printf("\n");
    return 0;
}

输出结果为:1 2 3 4 5

示例二

初始化一个双向循环链表,插入5个元素,分别为1,2,3,4,5。然后删除数据域为3的节点之后,从头节点开始遍历链表,输出每个节点的值。

int main()
{
    ListNode list = initList();
    for (int i = 1; i <= 5; i++)
    {
        insertTail(list, i);
    }
    deleteNode(list, 3);
    ListNode cur = list->next;
    while (cur != list)
    {
        printf("%d ", cur->data);
        cur = cur->next;
    }
    printf("\n");
    return 0;
}

输出结果为:1 2 4 5

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言数据结构之双向循环链表的实例 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • iOS9正式版固件下载地址大全 iOS9正式版升级教程

    iOS9正式版固件下载地址大全 iOS9是苹果公司推出的操作系统的最新版本。本攻略将为您提供iOS9正式版固件下载地址大全以及升级教程。 步骤一:备份数据 在升级之前,建议您先备份您的设备上的所有数据。这样可以确保您的数据在升级过程中不会丢失。您可以通过iTunes或iCloud进行备份。 步骤二:选择合适的固件下载地址 在升级之前,您需要下载适用于您的设备…

    other 2023年8月4日
    00
  • 百度蜘蛛是抓取网站和提高抓取频率的技巧分享

    下面我来详细讲解一下“百度蜘蛛是抓取网站和提高抓取频率的技巧分享”的完整攻略。 什么是百度蜘蛛? 百度蜘蛛是百度搜索引擎的爬虫程序,也叫做Baidu Spider(以下简称“蜘蛛”)。蜘蛛按照一定的规则和算法,自动地访问网页、收集网页内容和链接,进而生成网页索引并提供给用户搜索结果。 如何让百度蜘蛛更好地抓取网站? 1. 提高网站的可访问性 蜘蛛需要能够访问…

    other 2023年6月27日
    00
  • C语言操作符超详细讲解下篇

    C语言操作符超详细讲解下篇 一、逗号操作符 逗号操作符是C语言中最简单的一个操作符,它用于分隔表达式。当使用多个表达式时,逗号操作符可以用于把它们连接起来。当使用逗号操作符时,C语言会计算并忽略前面所有的表达式,只返回最后一个表达式的值。以下是一个逗号操作符的示例: int a = 1, b = 2, c = 3; int d = (a++, b++, c+…

    other 2023年6月27日
    00
  • win10电脑频繁蓝屏重启怎么解决?

    Win10电脑频繁蓝屏重启问题解决攻略 背景描述 频繁蓝屏重启是 Win10 电脑常见的一个问题。当电脑出现频繁蓝屏重启时,不仅会造成数据丢失,还会影响到我们的正常使用,因此需要我们及时解决这个问题。本文将会从多方面入手,详细讲解 Win10 电脑频繁蓝屏重启怎么解决。 解决方案 1. 更新系统补丁 Win10 系统经常会发布补丁来修复一些已知问题,因此我们…

    other 2023年6月27日
    00
  • Win11 全新右键菜单获开发者支持,WinRAR 已完成适配:无须再忍受二级菜单

    Win11 全新右键菜单获开发者支持 Windows 11 在右键菜单方面进行了全面升级,增加了许多新的功能,如全局音量、Snip & Sketch 等。同时,微软还允许开发人员对右键菜单进行自定义,这意味着用户可以通过安装软件等方式获得更好的右键菜单体验。 步骤一:安装支持 Win11 右键菜单的软件 为了获得更好的右键菜单体验,用户需要安装支持 …

    other 2023年6月27日
    00
  • Mac分区失败 未能修改分区图,因为文件系统验证失败该怎么解决?

    解决Mac分区失败的问题,首先需要了解该错误的原因。一般来说,Mac分区失败 未能修改分区图,因为文件系统验证失败的错误是由于文件系统出现了问题导致的。文件系统是一个非常重要的组成部分,它负责储存文件、访问权限和其他系统信息。一旦文件系统出现问题,就会导致分区失败错误。 下面是解决Mac分区失败的完整攻略: 步骤1:备份数据在进行任何分区操作之前,一定要备份…

    other 2023年6月27日
    00
  • jcreator pro怎么破解?jcreatorpro5.0安装、汉化及破解图文教程

    很抱歉,但我不能提供关于破解软件的指导或支持。这种行为是非法的,违反了软件的使用许可协议。我鼓励您遵守法律和道德准则,购买正版软件并支持开发者的努力。如果您有任何其他关于JCreator Pro的问题,我将很乐意帮助您。

    other 2023年7月27日
    00
  • Java的异常体系以及File类构造方法详解

    Java的异常体系 Java的异常体系是用于处理程序运行过程中出现的异常情况的一套机制。异常是指在程序运行过程中发生的错误或异常情况,例如除零错误、空指针引用等。Java的异常体系由一系列的异常类组成,这些异常类都是从Throwable类派生而来的。 异常类的层次结构 Java的异常类的层次结构如下所示: Throwable ├── Error └── Ex…

    other 2023年8月6日
    00
合作推广
合作推广
分享本页
返回顶部