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日

相关文章

  • 传送流(TS)的基础知识

    下面是关于传送流(TS)的基础知识的完整攻略,包括定义、结构和两个示例说明。 定义 传送流(TS)是数字电视广播中的一种数据传输方式,用于将多个音视频流、数据流和控制信息打包成一个统一的数据流进行传输。 结构 传送流(TS)的结构包括以下几个部分: 传输流同步字节: 传输流同步字节是传送流(TS)的起始标志,用于标识传输流(TS)的开始。 传输流头部: 传输…

    other 2023年5月6日
    00
  • 使用国内docker镜像源

    以下是“使用国内docker镜像源的完整攻略”的标准markdown格式文本,其中包含了两个示例说明: 使用国内Docker镜像源 Docker是一种流行的容器化技术,但是在使用Docker时,由于国际网络的限制,下载Docker镜像可能会很慢。为了解决这个问题,我们可以使用国内的Docker镜像源。本文将介绍如何使用国内Docker镜像源,包括两个示说明。…

    other 2023年5月10日
    00
  • 详解nginx服务器绑定域名和设置根目录的方法

    下面是详解”nginx服务器绑定域名和设置根目录的方法”的完整攻略。 设置域名解析 首先,我们需要在域名解析服务商处添加一条记录来将域名解析到服务器上。一般来说,我们需要添加一条A记录,将域名指向服务器的IP地址。如果您已经完成了这一步,请跳过此步骤。 安装nginx 接下来,我们需要在服务器上安装nginx。这里以Ubuntu系统为例,执行以下命令: su…

    other 2023年6月27日
    00
  • 杀戮间2怎么架设正版服务器_杀戮间2架设正版服务器方法(推荐)

    下面是杀戮间2架设正版服务器的完整攻略: 准备工作 首先需要准备以下两个文件: 杀戮间2服务器主程序:在Steam上下载杀戮间2时,可以在游戏库 – 工具中找到。将其下载并解压到一个目录下,例如 D:\SkullGirls2Server 杀戮间2授权文件:这个文件需要从官方申请,一般会在几分钟内发送到你的邮箱。请将其保存到 D:\SkullGirls2Ser…

    other 2023年6月27日
    00
  • Radmin影子版远程控制安装使用教程

    Radmin影子版远程控制安装使用教程 Radmin是Windows平台上一款功能强大的远程控制软件,可以帮助用户快速、安全地远程管理计算机。Radmin影子版是Radmin的一种基于Mirror Driver技术的版本,拥有更快速的远程控制响应速度和更友好的界面。 本文将会为读者介绍Radmin影子版的安装和使用方法,旨在帮助用户快速掌握Radmin影子版…

    other 2023年6月27日
    00
  • 服务器版Win10 泄露 附多张截图及官方镜像下载地址(64位英文版)

    服务器版Win10 泄露攻略 简介 本攻略将详细讲解如何获取服务器版Windows 10操作系统的泄露版本,并提供多张截图以及官方镜像下载地址。请注意,泄露版本可能存在安全风险,仅供学习和研究目的使用。 步骤 步骤一:查找泄露版本 在互联网上搜索服务器版Windows 10的泄露版本。可以使用搜索引擎,如Google或百度,输入相关关键词,如“服务器版Win…

    other 2023年8月3日
    00
  • 键盘重启电脑按哪个键 重启电脑按键组合介绍

    键盘重启电脑按哪个键 重启电脑按键组合介绍 在使用电脑过程中,经常需要重启电脑以解决一些故障或者更新系统,而键盘作为电脑的重要输入设备,其重启电脑的按键组合也是我们需要了解的常见问题。 按钮重启和硬重启 在重启电脑之前,我们需要知道两种常见的重启方式。一种是直接使用操作系统的重启按钮,另一种是进行硬重启。 操作系统的重启:可以在电脑操作系统的开始菜单或关机菜…

    other 2023年6月26日
    00
  • IDEA利用自带Axis工具和wsdl文件反向生成服务端客户端代码图文详解

    下面我来详细讲解如何利用IntelliJ IDEA自带的Axis工具和WSDL文件反向生成服务端和客户端的代码。 1. 准备工作 安装IntelliJ IDEA IDE,并安装Axis2插件。 准备好WSDL文件,或者通过已知的Web Service获取WSDL文件URL。 2. 设置Axis2插件 如果你还没有安装Axis2插件,可以按照如下步骤安装: 打…

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