C语言实现双向链表

C语言实现双向链表

简介

双向链表(Doubly Linked List)是一种常用的数据结构,其特点是每个节点既包含指向前驱节点的指针,也包含指向后继节点的指针。相比单向链表,它可以实现双向遍历,删除指定节点时无需遍历整个链表,提高了效率。

本文将详细介绍如何使用C语言实现双向链表。

实现步骤

  1. 定义节点结构体

    双向链表每个节点包含三个成员变量:数据域、指向前驱节点的指针、指向后继节点的指针。因此,我们首先需要定义一个节点结构体。

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

    其中,data表示该节点存储的数据,prev表示指向前驱节点的指针,next表示指向后继节点的指针。

  2. 定义链表结构体

    链表结构体包含两个指针变量:指向头节点和尾节点的指针。初始化时,头节点和尾节点均为NULL

    typedef struct List {
    Node *head;
    Node *tail;
    } List;

  3. 定义链表操作函数

    • createNode(int data):创建新节点,并返回指向该节点的指针。

      Node *createNode(int data) {
      Node *node = (Node*)malloc(sizeof(Node));
      node->data = data;
      node->prev = NULL;
      node->next = NULL;
      return node;
      }

    • insertNode(List *list, Node *node, int data):在指定节点之后插入新节点。

      void insertNode(List *list, Node *node, int data) {
      Node *newNode = createNode(data);
      newNode->prev = node;
      newNode->next = node->next;
      if (node->next == NULL) {
      list->tail = newNode;
      } else {
      node->next->prev = newNode;
      }
      node->next = newNode;
      }

    • deleteNode(List *list, Node *node):删除指定节点。

      void deleteNode(List *list, Node *node) {
      if (node->prev == NULL) {
      list->head = node->next;
      } else {
      node->prev->next = node->next;
      }
      if (node->next == NULL) {
      list->tail = node->prev;
      } else {
      node->next->prev = node->prev;
      }
      free(node);
      }

    • traverse(List *list):遍历整个链表,输出各个节点的数据。

      void traverse(List *list) {
      Node *node = list->head;
      while (node != NULL) {
      printf("%d ", node->data);
      node = node->next;
      }
      printf("\n");
      }

  4. 完整代码示例

    ```

    include

    include

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

    typedef struct List {
    Node head;
    Node
    tail;
    } List;

    Node createNode(int data) {
    Node
    node = (Node*)malloc(sizeof(Node));
    node->data = data;
    node->prev = NULL;
    node->next = NULL;
    return node;
    }

    void insertNode(List list, Node node, int data) {
    Node *newNode = createNode(data);
    newNode->prev = node;
    newNode->next = node->next;
    if (node->next == NULL) {
    list->tail = newNode;
    } else {
    node->next->prev = newNode;
    }
    node->next = newNode;
    }

    void deleteNode(List list, Node node) {
    if (node->prev == NULL) {
    list->head = node->next;
    } else {
    node->prev->next = node->next;
    }
    if (node->next == NULL) {
    list->tail = node->prev;
    } else {
    node->next->prev = node->prev;
    }
    free(node);
    }

    void traverse(List list) {
    Node
    node = list->head;
    while (node != NULL) {
    printf("%d ", node->data);
    node = node->next;
    }
    printf("\n");
    }

    int main() {
    List list = (List)malloc(sizeof(List));
    list->head = NULL;
    list->tail = NULL;

    Node *node1 = createNode(1);
    list->head = node1;
    list->tail = node1;
    
    Node *node2 = createNode(2);
    insertNode(list, node1, 2);
    
    Node *node3 = createNode(3);
    insertNode(list, node2, 3);
    
    deleteNode(list, node2);
    
    traverse(list);
    

    }
    ```

    程序执行结果为:

    1 3

    其中,先创建一个新链表,然后添加了3个节点(数据分别为1、2、3),然后删除了第二个节点,最后输出整个链表。可以看到,最终链表仅有两个节点(数据分别为1、3),并且能够成功进行双向遍历。

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

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

相关文章

  • C语言中的四种常量详解

    C语言中的四种常量详解 在C语言中,常量是指在程序中固定不变的值,我们可以通过常量来给程序提供基本的数据。C语言中共有四种类型的常量,包括整型常量、浮点型常量、字符常量和字符串常量。在本文中,我们将为大家详细讲解这四种类型的常量。 整型常量 整型常量是指仅包含数字的常量。它可以是十进制、八进制、或十六进制。整型常量默认为十进制。下面是一些整型常量的示例: i…

    other 2023年6月27日
    00
  • 自己动手怎么搭建私人服务器?搭建私人服务器的方法

    自己动手怎么搭建私人服务器?搭建私人服务器的方法 概述 搭建私人服务器意味着您有一个能够在互联网上访问的网站。该网站可以用于存储和分享文件、托管应用程序和网站以及提供能够在全球范围内访问的在线服务。在本文中,我们将介绍如何自己动手搭建私人服务器的方法。 步骤 1. 购买域名和主机 首先,您需要购买一个域名和服务器主机才能在互联网上托管自己的网站。域名是您网站…

    other 2023年6月27日
    00
  • 在Linux中为现有用户创建主目录:useradd问题

    在Linux中为现有用户创建主目录:useradd问题 当我们在创建用户的过程中,如果不添加-m或–create-home选项,用户的主目录将不会被创建。那么,有时候我们需要为现有的用户创建主目录该怎么做呢?下面是详细的步骤: 使用命令useradd添加一个新用户 首先,在Linux中我们需要先创建一个新用户,可以使用useradd命令,例如: sudo …

    other 2023年6月26日
    00
  • 如何禁止电脑指定程序不能运行 怎么屏蔽QQ或游戏运行提高办公效率

    关于如何禁止电脑指定程序不能运行和屏蔽QQ或游戏运行提高办公效率,可以通过以下两种方式实现。 禁止电脑指定程序不能运行 方式一:使用组策略编辑器 步骤如下: 按下 Win + R 组合键,打开运行窗口,输入 gpedit.msc 可以进入“组策略编辑器” 在左侧树状图中找到“计算机配置->Windows设置->安全设置->软件限制策略” 在…

    other 2023年6月25日
    00
  • 什么是大数据?

    大数据的完整攻略主要分为以下几个阶段: 数据采集:从各种数据源(如数据库、文本文件、web日志、传感器设备等)中收集数据,并进行初步处理和清洗。数据采集阶段需要考虑数据来源的多样性、数据量的大小和数据的完整性等因素。 数据存储:将采集到的数据保存到大数据存储系统(如Hadoop HDFS、Cassandra、MongoDB等)中,以便后续使用和处理。数据存储…

    其他 2023年4月19日
    00
  • VMware Tools一直灰色 无法安装问题及解决方案

    VMware Tools 一直灰色无法安装问题及解决方案 问题描述 在使用 VMware 虚拟机时,有时会发现虚拟机中的 VMware Tools 选项一直处于灰色,无法进行安装。 可能原因 当前电脑的 VMware Workstation 版本过低,不支持当前虚拟机版本的 VMware Tools 安装。 虚拟机所使用的操作系统版本过旧。 解决方案 针对不…

    other 2023年6月26日
    00
  • Day01_JAVA语言基础第一天

    本文将介绍Java语言基础第一天的完整攻略,包括Java语言的基本概念、数据类型、运算符、流程控制语句等内容。同时,本文还将提供两个示例说明,以帮助读者更好地理解Java语言的基础知识。 1. Java语言基本概念 Java是一种面向对象的编程语言,它具有跨平台性、安全性、可靠性等特点。Java程序由类组成,每个类包含属性和方法。Java程序的执行从main…

    other 2023年5月5日
    00
  • LESS 让css也支持变量,运算符,include,嵌套规则等等

    LESS 是一种 CSS 预处理器,它扩展了 CSS 的功能,使其支持变量、运算符、包含(include)和嵌套规则等特性。下面是详细的攻略: 1. 安装 LESS 首先,你需要安装 LESS。你可以通过 npm(Node Package Manager)来安装 LESS,使用以下命令: npm install -g less 2. 创建 LESS 文件 创…

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