C语言类的双向链表详解

C语言类的双向链表详解

基本概念

什么是双向链表?

双向链表是链表的一种,它有两个指针域:一个指向前一个结点,一个指向后一个结点。每个结点包含两个部分:数据和指针域,指针域分别指向前一个结点和后一个结点,所以每个结点都是由数据和两个指针域构成的。

双向链表的作用?

双向链表可以支持O(1)时间复杂度的在任何一个结点前或后插入一个结点。

双向链表的实现方式?

在C语言中,双向链表可以通过结构体和指针来实现,我们使用struct定义每个链表结点,包含数据和两个指针域。通过指针来连接每个结点形成链表,指针可以动态的指向前后结点,实现双向遍历。

创建双向链表

初始化一个双向链表

struct Node {
    int data;
    struct Node* next;
    struct Node* prev;
};

// 初始化一个空的双向链表
struct Node* linkedlist_init() {
    struct Node* head = (struct Node*) malloc(sizeof(struct Node));
    head->data = 0;
    head->next = NULL;
    head->prev = NULL;
    return head;
}

向双向链表中插入一个结点

// 在双向链表的pos位置增加一个节点node
void linkedlist_insert(struct Node* pos, struct Node* node) {
    node->next = pos->next;
    pos->next->prev = node;
    node->prev = pos;
    pos->next = node;
}

从双向链表中删除一个结点

// 从双向链表中删除一个节点
void linkedlist_delete(struct Node* node) {
    node->prev->next = node->next;
    node->next->prev = node->prev;
    free(node);
}

示例

示例1

以下示例展示了如何创建一个双向链表,并在其中插入3个结点,再删除第2个结点。

int main(void) {
    struct Node* head = linkedlist_init();
    struct Node* node1 = (struct Node*) malloc(sizeof(struct Node));
    struct Node* node2 = (struct Node*) malloc(sizeof(struct Node));
    struct Node* node3 = (struct Node*) malloc(sizeof(struct Node));

    node1->data = 1;
    node2->data = 2;
    node3->data = 3;

    linkedlist_insert(head, node1); // head->node1
    linkedlist_insert(node1, node2); // head->node1->node2
    linkedlist_insert(node2, node3); // head->node1->node2->node3

    linkedlist_delete(node2); // head->node1->node3

    return 0;
}

示例2

以下示例展示了如何遍历一个双向链表,分别从头、尾、中间向前、向后遍历链表。

int main(void) {
    // 创建一个双向链表并初始化
    struct Node* head = linkedlist_init();
    struct Node* node1 = (struct Node*) malloc(sizeof(struct Node));
    struct Node* node2 = (struct Node*) malloc(sizeof(struct Node));
    struct Node* node3 = (struct Node*) malloc(sizeof(struct Node));
    struct Node* node4 = (struct Node*) malloc(sizeof(struct Node));
    struct Node* node5 = (struct Node*) malloc(sizeof(struct Node));

    node1->data = 1;
    node2->data = 2;
    node3->data = 3;
    node4->data = 4;
    node5->data = 5;

    linkedlist_insert(head, node1); // head->node1
    linkedlist_insert(node1, node2); // head->node1->node2
    linkedlist_insert(node2, node3); // head->node1->node2->node3
    linkedlist_insert(node3, node4); // head->node1->node2->node3->node4
    linkedlist_insert(node4, node5); // head->node1->node2->node3->node4->node5


    // 从头开始向后遍历
    for (struct Node* p = head->next; p != NULL; p = p->next) {
        printf("%d ", p->data); // 1 2 3 4 5
    }
    printf("\n");

    // 从尾开始向前遍历
    for (struct Node* p = node5; p != NULL; p = p->prev) {
        printf("%d ", p->data); // 5 4 3 2 1
    }
    printf("\n");

    // 从中间开始向前遍历
    for (struct Node* p = node2->prev; p != NULL; p = p->prev) {
        printf("%d ", p->data); // 1
    }
    printf("\n");

    // 从中间开始向后遍历
    for (struct Node* p = node2; p != NULL; p = p->next) {
        printf("%d ", p->data); // 2 3 4 5
    }
    printf("\n");

    return 0;
}

总结

双向链表是一种非常实用的数据结构,在很多场景中都能够发挥巨大的作用。上述介绍的初始化、插入、删除等常用操作都是非常基础的操作,通过合理应用这些操作可以实现更加复杂、高效的数据处理。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言类的双向链表详解 - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • C++数据结构之搜索二叉树的实现

    C++数据结构之搜索二叉树的实现 搜索二叉树(Binary Search Tree, BST)是一种常见的数据结构,它支持快速地查找、插入和删除元素。本文将详细讲述如何用C++实现搜索二叉树。 一、搜索二叉树的定义 搜索二叉树是一种二叉树,它满足以下性质: 对于任意一个节点,其左子树中的所有节点都小于它,其右子树中的所有节点都大于它; 每个节点的左右子树也都…

    数据结构 2023年5月17日
    00
  • 数据结构之线性表

    Linear_list 类型定义 一个线性表是n个数据元素的有限序列,线性表中的元素个数n定义为线性表的长度,n=0时成为空表;抽象数据类型: InitList(&L) //构造空线性表L DestroyList(&L) //销毁线性表L ClearList(&L) //将L重置为空表 ListEmpty(L) //若L为空表返回TR…

    算法与数据结构 2023年4月25日
    00
  • Java数据结构之图的路径查找算法详解

    Java数据结构之图的路径查找算法详解 什么是图? 在计算机科学中,图是一种非常常见的数据结构,用于表示图形和网络等概念。图由节点和边组成,其中节点表示实体,边表示这些实体之间的关系。节点和边可以表示各种各样的实体和关系,因此图在计算机科学中具有广泛的应用。 图的路径查找算法 路径查找算法是一个用途广泛的算法,它用于查找从一个节点到另一个节点的路径。在图中,…

    数据结构 2023年5月17日
    00
  • C语言如何建立链表并实现增删查改详解

    这是一个比较复杂的问题,需要严谨的思考和详细的解释。下面我将按照以下三个部分,分别介绍: 什么是链表,链表的基本结构和实现方法 如何在C语言中建立链表并实现增删查改 两个示例说明 1. 链表的基本结构和实现方法 链表是一种线性数据结构,每个节点包含两个域:一个数据域和一个指针域。数据域存储节点的数据,指针域存储下一个节点的地址。每个节点都可以独立分配空间,所…

    数据结构 2023年5月17日
    00
  • AtCoder Beginner Contest 299

    A – Treasure Chest (abc299 a) 题目大意 给定一个包含 |*.的字符串,其中|两个,*一个,问*是否在两个|之间。 解题思路 找到两个|的下标\(l, r\)以及 *的下标\(mid\),看看是否满足 \(l < mid < r\)即可。 神奇的代码 #include <bits/stdc++.h> usi…

    算法与数据结构 2023年4月23日
    00
  • C语言链表详解及代码分析

    C语言链表详解及代码分析 简介 链表是一种常见的数据结构,它主要用于存储线性数据结构,可以动态地进行添加和删除操作。在C语言中,链表可以通过链式存储结构来实现。本篇攻略将详细讲解C语言链表的实现,包括定义链表、节点、添加节点、删除节点等操作。 链表的定义 链表由一个个节点组成,每个节点包含两个信息:数据和指向下一个节点的指针。在C语言中,可以通过结构体实现每…

    数据结构 2023年5月17日
    00
  • 「学习笔记」二分图

    「学习笔记」二分图 点击查看目录 目录 「学习笔记」二分图 知识点 定义及判定 二分图最大匹配 二分图最小点覆盖 二分图最大独立集 例题 P7368 [USACO05NOV]Asteroids G 思路 P2319 [HNOI2006]超级英雄 思路 Way Selection 题意 思路 文理分班 题意 思路 放置机器人 题意 思路 猫和狗 题意 思路 知…

    算法与数据结构 2023年4月18日
    00
  • C++数据结构与算法之反转链表的方法详解

    C++数据结构与算法之反转链表的方法详解 在C++中,反转链表是一种常见的数据结构与算法技巧。在本文中,我们将详细讲解反转链表的实现过程以及常见的两种反转方法。 基本定义 在开始讲述反转链表算法之前,我们先介绍一下链表的基本定义。 链表是一种数据结构,其中每个节点包含一个数据元素和一个指向下一个节点的指针。下面是一个简单的链表的节点结构定义: struct …

    数据结构 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部