C语言双向链表的原理与使用操作

C语言双向链表的原理与使用操作

什么是双向链表

双向链表是由一系列结点组成的数据结构,每个结点除了有指向下一个结点的指针,还有指向上一个结点的指针。这种链表可以从头到尾或者从尾到头进行遍历。

双向链表的结构

下面是一个双向链表的结构体定义:

typedef struct Node{
    int data;
    struct Node *pre;
    struct Node *next;
}node;

其中data表示结点所存储的数据,prenext分别表示指向前一个结点和后一个结点的指针。

双向链表的操作

初始化

在创建双向链表之前需要先进行初始化,定义一个头节点指针,并将其指向NULL。代码如下:

node *head = NULL;

插入

双向链表的插入操作比较灵活,可以在任意位置插入。假设要在第二个结点的位置插入一个新的结点,代码如下:

node *new_node = (node *)malloc(sizeof(node));
new_node->data = 10;

node *temp = head->next;
head->next = new_node;
new_node->pre = head;
new_node->next = temp;
if (temp != NULL) {
    temp->pre = new_node;
}

首先先创建一个新的结点并赋值,然后将当前节点的后继赋值给新节点的后继,将新节点的前驱赋值为当前节点,将新节点连到当前节点的后面。

删除

双向链表的删除操作也比较灵活,同样可以删除任意位置的结点。假设要删除第二个结点,代码如下:

node *temp = head->next;
if (temp != NULL) {
    head->next = temp->next;
    if (temp->next != NULL) {
        temp->next->pre = head;
    }
    free(temp);
}

首先将当前节点的后继节点保存到临时变量中,然后修改当前节点的后继指向下一个节点,如果下一个节点存在,则将它的前驱指针修改为当前节点,最后释放掉被删除的节点。

示例

以下是一个简单的示例用来说明双向链表的使用操作:

#include <stdio.h>
#include <stdlib.h>

typedef struct Node{
    int data;
    struct Node *pre;
    struct Node *next;
}node;

void insert(node *head, int data);
void delete(node *head, int data);
void print(node *head);

int main() {
    node *head = (node *)malloc(sizeof(node));
    head->pre = NULL;
    head->next = NULL;

    insert(head, 10);
    insert(head, 20);
    insert(head, 30);
    insert(head, 40);
    insert(head, 50);

    delete(head, 30);

    print(head);

    // 释放节点
    node *temp;
    while (head != NULL) {
        temp = head;
        head = head->next;
        free(temp);
    }

    return 0;
}

void insert(node *head, int data) {
    node *new_node = (node *)malloc(sizeof(node));
    new_node->data = data;

    node *temp = head->next;
    head->next = new_node;
    new_node->pre = head;
    new_node->next = temp;
    if (temp != NULL) {
        temp->pre = new_node;
    }
}

void delete(node *head, int data) {
    node *temp = head->next;
    while (temp != NULL) {
        if (temp->data == data) {
            temp->pre->next = temp->next;
            if (temp->next != NULL) {
                temp->next->pre = temp->pre;
            }
            free(temp);
            return;
        }
        temp = temp->next;
    }
    printf("节点不存在\n");
}

void print(node *head) {
    node *temp = head->next;
    printf("链表内容:");
    while (temp != NULL) {
        printf("%d ", temp->data);
        temp = temp->next;
    }
    printf("\n");
}

运行结果:

链表内容:10 20 40 50 

以上就是C语言双向链表的原理与使用操作的完整攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言双向链表的原理与使用操作 - Python技术站

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

相关文章

  • Android实现分享功能

    以下是使用标准的Markdown格式文本,详细讲解Android实现分享功能的完整攻略: Android实现分享功能 步骤1:添加分享按钮 首先,在您的Android应用界面中添加一个分享按钮,可以是一个图标或者文本按钮。例如: <Button android:id=\"@+id/btn_share\" android:layout…

    other 2023年10月14日
    00
  • 手机SD内存卡有空间却不能下载东西怎么办?

    手机SD内存卡有空间却不能下载东西的解决攻略 如果你的手机SD内存卡有足够的空间,但是无法下载东西,可能是由于以下原因导致的。下面是解决这个问题的完整攻略: 步骤一:检查SD内存卡连接 首先,确保SD内存卡正确连接到手机上。有时候,SD卡可能会松动或者不完全插入,导致手机无法读取或写入数据。请按照以下步骤检查连接: 关机:先将手机关机,然后取下SD内存卡。 …

    other 2023年7月31日
    00
  • 如何解决家里宽带IP变成内网地址?详解WAN IP地址变成内网地址教程

    如何解决家里宽带IP变成内网地址 当家里宽带IP变成内网地址时,我们可以采取以下步骤来解决这个问题。 步骤一:检查路由器设置 首先,我们需要检查路由器的设置,确保它正确地配置了WAN口的连接类型。以下是一些常见的连接类型: DHCP:如果你的ISP(互联网服务提供商)使用动态IP分配,你应该选择DHCP连接类型。这样,路由器将自动获取一个公共IP地址。 PP…

    other 2023年7月30日
    00
  • Lua字符串库(string库)学习笔记

    Lua字符串库(string库)学习笔记 Lua字符串是像其他编程语言中字符串一样的不可变的序列。Lua提供了强大的字符串操作方法来帮助我们对字符串进行处理。本篇笔记将详细讲解Lua字符串库(string库)的常用方法。 Lua字符串的基本操作 字符串长度 字符串长度用 # 进行求值,例如: local str = "hello world&quo…

    other 2023年6月20日
    00
  • redistemplate获取过期时间的问题

    以下是关于“RedisTemplate获取过期时间的问题”的完整攻略: 步骤1:获取RedisTemplate实例 在使用RedisTemplate获取过期时间之前,需要获取RedisTemplate实例。可以使用以下代码获取RedisTemplate实例: @Autowired private RedisTemplate<String, Object…

    other 2023年5月7日
    00
  • C++利用Socket实现主机间的UDP/TCP通信

    C++利用Socket实现主机间的UDP/TCP通信攻略 什么是Socket? 在计算机网络中,Socket又被称为“套接字”,是计算机之间通信的一种抽象,它是TCP/IP协议族中API的一部分,是支持TCP/IP协议的网络通信的基本操作单元,可以通过Socket在两台计算机之间建立连接,进行数据传输。 实现主机间的UDP通信 1. 创建一个UDP套接字 在…

    other 2023年6月26日
    00
  • IIC双向电平转换电路设计

    IIC双向电平转换电路设计的完整攻略 IIC总线是一种常用的串行通信协议,用于连接微控制器和各种外设。由于不同设备的电平标准可能不同,因此需要使用电转换电路来实现IIC总线的双向通信。本文将提供IIC双向电平转换电路设计的完整攻略,包括以下内容: 硬件和软件要求 电路设计 示例 硬件和软件要求 在设计IIC双向电平转换电路之前,需要准备以下硬件和软件: 硬件…

    other 2023年5月6日
    00
  • Android Rsa数据加解密的介绍与使用示例

    Android RSA数据加解密的介绍与使用示例攻略 介绍 RSA(Rivest-Shamir-Adleman)是一种非对称加密算法,广泛应用于数据加密和数字签名等领域。在Android开发中,我们可以使用RSA算法对数据进行加密和解密操作。 RSA算法涉及到公钥和私钥的概念。公钥用于加密数据,私钥用于解密数据。在Android中,我们可以使用KeyPair…

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