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

yizhihongxing

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日

相关文章

  • C语言入门篇–变量[定义,初始化赋值,外部声明]

    C语言入门篇–变量[定义,初始化赋值,外部声明] 1. 变量定义 变量是C语言中非常重要的概念,变量定义指的是声明一个变量来存储特定类型的数据,并为该变量分配内存空间。 //一般形式为:数据类型 变量名; int num; char ch; float f; double d; C语言中支持多种基本数据类型,包括整型、字符型、浮点型、双精度型等。其中,in…

    other 2023年6月20日
    00
  • unsigned在c语言中的用法

    unsigned在C语言中的用法 在C语言中,unsigned关键字通常用于标识无符号整数类型。它可以用于修改整数类型的范围,并帮助我们更好地管理整数值的存储空间。 unsigned的定义 unsigned是C语言中的一种类型修饰符,它可以与各种整数类型一起使用,如unsigned char、unsigned short、unsigned int等。使用un…

    其他 2023年3月28日
    00
  • Python实现合并两个有序链表的方法示例

    Python实现合并两个有序链表的方法示例 当我们需要将两个有序链表合并成一个新的有序链表时,可以采用一些算法来实现。下面将详细讲解Python实现合并两个有序链表的方法示例如下: 方法一:递归实现 在递归调用过程中,我们需要判断两个链表中第一个节点的大小,并将小的节点作为合并后链表的头节点,并将该节点的next指针指向递归调用返回的node。 class …

    other 2023年6月27日
    00
  • 演员向佐的家世:向佐家世背景怎么样?

    演员向佐是中国内地的一位年轻演员,因其出演电视剧《陈情令》中的角色而广受欢迎。他的家世背景备受关注,本文将提供关于向佐家世背景的详细攻略。 了解向佐的家庭背景 向佐的父亲是著名演员向华强。 向华强是香港电影圈的知名人物,他曾经主演过多部经典电影,如《英雄本色》、《赌神》等。他还是华谊兄弟的创始人之一,是中国电影产业的重要人物之一。 向佐的母亲是演员吕丽萍。 …

    other 2023年5月9日
    00
  • 如何安装python的yaml包?

    如何安装Python的yaml包? yaml是一种轻量级的数据序列化格式,常用于配置文件和数据交换。在Python中,可以使用PyYAML库来解析和yaml格式的。本攻略将详细介绍如何安装PyYAML库,包括使用pip安装和手动安装种方法,并提供两示例说明。 使用pip安装 使用pip是安装Python库的最简单方法之一。以下是使用pip安装PyY`库的步骤…

    other 2023年5月7日
    00
  • etc/profile环境变量配置解析

    当我们在Linux系统中登录到一个用户账号时,~/.bashrc和/etc/profile都会自动地被执行。其中,/etc/profile对整个系统的所有用户都生效。 /etc/profile文件主要是用来配置全局的环境变量,如PATH、JAVA_HOME、CLASSPATH等。可以使用标准的shell语法来定义这些变量。因为它是全局的,所以面对不同的需求和…

    other 2023年6月27日
    00
  • win10占空间怎么办 win10精简功能教程

    Win10占空间怎么办 Windows 10是一个功能强大的操作系统,但它也会占用相当大的磁盘空间。如果你的硬盘空间有限,你可能需要采取一些措施来减少Win10的占用空间。下面是一些方法可以帮助你精简Win10的功能并释放磁盘空间。 1. 卸载不需要的应用程序 Win10预装了许多应用程序,而你可能并不需要它们。卸载这些不需要的应用程序可以释放一些磁盘空间。…

    other 2023年8月1日
    00
  • aspnetpager控件的最基本用法

    aspnetpager控件的最基本用法 介绍 ASP.NET Pager控件是一种在各种情况下很有用的控件,可以让网站更加动态和易于使用。通过使用这个控件,您可以方便地分页大量数据,并在网页上显示它们。这篇文章将向您展示ASP.NET Pager控件的最基本用法。 安装 ASP.NET Pager控件可以通过NuGet下载和安装。只需打开Package Ma…

    其他 2023年3月29日
    00
合作推广
合作推广
分享本页
返回顶部