C语言双向链表的表示与实现实例详解

C语言双向链表的表示与实现实例详解

一、概述

双向链表(doubly linked list)是一种链式存储结构,与单向链表类似,但每个节点不仅包含了一个指向下一个节点的指针,还包含了一个指向前一个节点的指针。这样可以方便地在链表的前后进行遍历和操作。

本篇攻略将详细讲解C语言双向链表的表示与实现。包括链表的结构定义、操作实现和两个示例说明。

二、结构定义

在C语言中定义一个双向链表节点的结构体如下:

typedef struct node {
  int data;
  struct node *prev; // 上一个节点指针
  struct node *next; // 下一个节点指针
} Node;

其中,data代表节点的数据部分,prevnext分别代表上一个节点和下一个节点的指针。

同时,为了方便操作链表,需要定义一个指向链表头部的指针和链表长度的变量:

typedef struct {
  Node *head; // 链表头部指针
  int length; // 链表长度
} LinkedList;

其中,head为指向链表头部的指针,length为链表长度。

三、操作实现

3.1 初始化操作

初始化一个双向链表需要分配内存,这里定义一个initLinkedList函数:

LinkedList *initLinkedList() {
  LinkedList *list = (LinkedList *) malloc(sizeof(LinkedList));
  list->head = (Node *) malloc(sizeof(Node));
  list->head->prev = NULL;
  list->head->next = NULL;
  list->length = 0;
  return list;
}

其中,malloc函数分配了两段内存,一段存放LinkedList结构体,一段存放节点的数据内容。

3.2 插入操作

在一个双向链表中插入一个节点需要指定插入位置和后继节点。这里定义一个insertNode函数,实现将新节点插入到指定位置。

void insertNode(LinkedList *list, int index, int data) {
  if (index < 0 || index > list->length) {
    printf("Invalid index\n");
    return;
  }
  Node *newNode = (Node *) malloc(sizeof(Node));
  newNode->data = data;
  Node *p = list->head;
  for (int i = 0; i < index; i++) {
    p = p->next;
  }
  newNode->prev = p;
  newNode->next = p->next;
  if (p->next != NULL) {
    p->next->prev = newNode;
  }
  p->next = newNode;
  list->length++;
}

以上代码中,如果输入的index超出了链表长度或小于0,那么会输出Invalid index。否则创建一个新的节点,将其插入在指定位置,同时更新链表长度。

3.3 删除操作

在一个双向链表中删除一个节点需要指定删除位置。这里定义一个deleteNode函数,实现删除指定位置的节点。

void deleteNode(LinkedList *list, int index) {
  if (index < 0 || index >= list->length) {
    printf("Invalid index\n");
    return;
  }
  Node *p = list->head;
  for (int i = 0; i < index; i++) {
    p = p->next;
  }
  p->prev->next = p->next;
  if (p->next != NULL) {
    p->next->prev = p->prev;
  }
  free(p);
  list->length--;
}

以上代码中,如果输入的index超出了链表长度或小于0,那么会输出Invalid index。否则找到需要删除的节点,使其前后两个节点互相指向,然后释放该节点的内存,同时更新链表长度。

四、示例说明

4.1 实例一

在这个示例中,创建了一个包含4个节点的链表,并依次插入了两个节点,最后删除了第三个节点。

int main() {
  LinkedList *list = initLinkedList();

  insertNode(list, 0, 1);
  insertNode(list, 1, 2);
  insertNode(list, 2, 3);
  insertNode(list, 3, 4);
  printf("Before delete, the length of the linkedlist is: %d\n", list->length);

  deleteNode(list, 2);
  printf("After delete, the length of the linkedlist is: %d\n", list->length);

  return 0;
}

运行结果:

Before delete, the length of the linkedlist is: 4
After delete, the length of the linkedlist is: 3

4.2 实例二

在这个示例中,创建了一个包含10个节点的链表,并使用循环插入节点,最后打印出所有节点的数据。

int main() {
  LinkedList *list = initLinkedList();

  for (int i = 1; i <= 10; i++) {
    insertNode(list, i - 1, i);
  }

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

  return 0;
}

运行结果:

1 2 3 4 5 6 7 8 9 10

五、总结

本篇攻略详细讲解了C语言双向链表的表示与实现,包括结构定义、操作实现和两个示例说明。这种数据结构可以应用于需要快速查找、插入和删除节点的场景,具有一定的实用价值。

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

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

相关文章

  • mysql 如何使用JSON_EXTRACT() 取json值

    当mysql存储JSON格式的数据时,我们需要对JSON进行提取。MySQL 5.7版本以上,提供了JSON_EXTRACT()函数来实现从JSON中提取值。 JSON_EXTRACT()函数的语法 JSON_EXTRACT(json_path) json_path为JSON路径参数,返回该路径下的JSON值。 示例1 已知json字段’data’的值为: …

    C 2023年5月23日
    00
  • 一个基于C#开发的Excel转Json工具使用教程

    下面将会给出一份“一个基于C#开发的Excel转Json工具使用教程”的完整攻略。 一、背景 在数据处理中,Excel表格是非常常见的一种数据表现形式。而Json格式则是Web开发中常用的数据格式。因此,将Excel表格转换为Json格式也是一个非常实用的需求。本文将介绍如何使用一个基于C#开发的工具将Excel表格转换为Json格式。 二、准备工作 在使用…

    C 2023年5月23日
    00
  • Golang中tinyrpc框架的源码解读详解

    Golang中tinyrpc框架的源码解读详解 什么是tinyrpc框架? tinyrpc是一个轻量级的RPC(Remote Procedure Call)框架,用于构建分布式应用程序,客户端和服务器之间的通信通过网络进行。该框架基于Golang编写,因其高可用性和高性能而广泛受到开发者的青睐。 框架的核心分析 tinyrpc框架的核心是分布在客户端(cli…

    C 2023年5月23日
    00
  • C语言 保留字

    C语言保留字的使用攻略 在C语言中,保留字是指被C语言编译器预先定义并且有特定含义的关键字。C语言中共有32个关键字,这32个关键字在程序中不能被用作变量名或其他标识符名称。本文将详细介绍C语言中保留字的使用方法。 如何使用C语言的保留字 C语言中的保留字使用非常简单,只需要直接使用即可。以下是一些常见的保留字: auto break case char c…

    C 2023年5月9日
    00
  • C语言实现求解素数的N种方法总结

    C语言实现求解素数的N种方法总结 简介 本文将总结C语言实现求解素数的N种方法。素数是只能被1和本身整除的正整数,对于计算机编程而言,求解素数是一个常见的问题。本文将介绍7种解决大约从100以内寻找素数至大约1百万以内寻找素数的方法。 方法一:暴力枚举 对于一个数n,从2开始枚举到sqrt(n)为止,判断n是否能被2~sqrt(n)中的任一数整除。如果n不能…

    C 2023年5月22日
    00
  • C语言实现翻译功能

    C语言实现翻译功能的攻略包含以下步骤: 确定翻译API 在开始编写翻译功能之前,必须先确定使用哪个翻译API。常用的翻译API有百度翻译API、谷歌翻译API、有道翻译API等。需要注意的是,不同的翻译API具有不同的使用规则和参数设置,使用之前需要仔细阅读相应的开发文档。 在C语言中调用API 确定了翻译API后,需要在C语言中编写代码调用该API。一般情…

    C 2023年5月23日
    00
  • python中的Json模块dumps、dump、loads、load函数用法详解

    下面是关于 Python 中的 Json 模块 dumps、dump、loads、load 函数的使用详解: Json 简介 Json是一种基于文本的轻量级数据交换格式,常用于前后端数据交互、配置文件等场合。在 Python 中,可以使用 Json 模块来对 Json 数据进行解析和生成。 Json 模块函数说明 dumps 函数 dumps 函数将一个 P…

    C 2023年5月23日
    00
  • 乐玩2C后盖怎么打开 TCL乐玩2C手机打开后盖方法图解

    TCL乐玩2C手机后盖打开方法 前言 TCL乐玩2C是一款较为受欢迎的手机,但是许多用户可能都会遇到不知道如何打开后盖的问题。在此,本文将详细讲解乐玩2C手机如何打开后盖。 注意事项 在操作前请确保手机已关闭,并且拆卸后盖可能会对手机造成损害,请谨慎操作。建议您在比较熟悉的环境下进行拆卸。 操作步骤 步骤1:准备工具和材料 你需要先准备一把打开手机后盖的工具…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部