C语言中双链表的基本操作

下面是C语言中双链表的基本操作的完整攻略。

双链表的基本操作

什么是双链表

双向链表(Doubly linked list)是链表的一种,它同样由一系列的节点组成,每个结点分别含有指向前驱和后继结点的两个指针。这种结构允许双向遍历。常见的操作有前插、后插、删除、查找等,下面详细介绍其基本操作。

双链表的结构

双链表的结构如下所示:

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

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

新建双链表

新建一个双链表需要定义一个头指针,头指针指向链表的头结点,且头结点不存储数据,只是一个空节点。

struct node head;
struct node *list = &head;//定义头指针

head.pre = NULL;
head.next = NULL;

以上代码表示创建了一个空的双链表,头指针指向的是头结点。

双链表的插入

首节点插入

int insert_head(struct node *list, int data){
    struct node *new_node = (struct node*)malloc(sizeof(struct node));
    if(new_node == NULL){//内存分配失败,返回0
        return 0;
    }
    new_node->data = data;
    new_node->pre = list;//头结点的前驱指针指向空
    new_node->next = list->next;
    list->next->pre = new_node;
    list->next = new_node;
    return 1;//插入成功,返回1
}

在双链表的头部插入一个新的节点,需要执行以下步骤:

  1. 创建一个新的节点 new_node
  2. 将新节点的数据域赋值为 data
  3. 将新节点的前驱指针指向头结点;
  4. 将新节点的后继指针指向头结点的后继结点;
  5. 将头结点的后继结点的前驱指针指向新节点;
  6. 将头结点的后继指针指向新节点;
  7. 插入成功,返回1。

尾节点插入

int insert_tail(struct node *list, int data){
    struct node *new_node = (struct node*)malloc(sizeof(struct node));
    if(new_node == NULL){//内存分配失败,返回0
        return 0;
    }
    struct node *p = list;
    while(p->next != NULL){
        p = p->next;
    }
    new_node->data = data;
    new_node->pre = p;
    new_node->next = NULL;
    p->next = new_node;
    return 1;//插入成功,返回1
}

在双链表的尾部插入一个新的节点,需要执行以下步骤:

  1. 创建一个新的节点 new_node
  2. 将新节点的数据域赋值为 data
  3. 找到双链表的尾节点 p
  4. 将新节点的前驱指针指向尾节点 p
  5. 将新节点的后继指针指向空;
  6. 将尾节点 p 的后继指针指向新节点;
  7. 插入成功,返回1。

双链表的删除

int delete_node(struct node *list, int data){
    struct node *p = list->next;
    while(p != NULL){
        if(p->data == data){
            p->pre->next = p->next;
            p->next->pre = p->pre;
            free(p);
            return 1;//删除成功,返回1
        }
        p = p->next;
    }
    return 0;//删除失败,返回0
}

双链表的删除操作需要传入双链表的头指针和要删除节点的值 data,需要执行以下步骤:

  1. 找到要删除的节点 p
  2. 将要删除节点前一个节点的后继指针指向要删除节点的后继节点;
  3. 将要删除节点后一个节点的前驱指针指向要删除节点的前一个节点;
  4. 释放要删除的节点的内存空间;
  5. 删除成功,返回1;
  6. 如果没有找到要删除的节点,返回0。

双链表的查找

struct node *search_node(struct node *list, int data){
    struct node *p = list->next;
    while(p != NULL){
        if(p->data == data){
            return p;//找到节点,返回该节点
        }
        p = p->next;
    }
    return NULL;//未找到节点,返回NULL
}

双链表的查找操作需要传入双链表的头指针和要查找节点的值 data,需要执行以下步骤:

  1. 找到要查找的节点 p
  2. 如果找到了,返回该节点;
  3. 如果没有找到,返回 NULL

示例说明

下面是双链表的创建、插入、删除和查找的示例:

int main(){
    struct node head;
    struct node *list = &head;

    head.pre = NULL;
    head.next = NULL;

    insert_head(list, 1);
    insert_head(list, 2);
    insert_tail(list, 3);

    printf("双链表为:");
    struct node *p = list->next;
    while(p != NULL){
        printf("%d ", p->data);
        p = p->next;
    }
    printf("\n");

    delete_node(list, 2);

    printf("删除节点2后的双链表为:");
    p = list->next;
    while(p != NULL){
        printf("%d ", p->data);
        p = p->next;
    }
    printf("\n");

    struct node *target_node = search_node(list, 3);
    if(target_node != NULL){
        printf("查找节点3成功!\n");
    }else{
        printf("查找节点3失败!\n");
    }

    return 0;
}

输出结果如下:

双链表为:2 1 3
删除节点2后的双链表为:1 3
查找节点3成功!

以上代码示例创建了一个双链表,并在双链表的头部和尾部插入节点,然后删除了值为2的节点,最后查找了值为3的节点。

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

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

相关文章

  • java15新功能的详细讲解

    Java 15 新功能的详细讲解攻略 简介 Java 15 是 Java 编程语言的最新版本,于 2020 年 9 月发布。它包含了多项新增功能和改进,如 ZGC 改进、密封类、预览特性、记录类型等。 本攻略将详细介绍 Java 15 的新功能,以及如何使用这些新功能来提高开发人员的效率以及增强代码可读性。 密封类 Java 15 引入了密封类(sealed…

    C 2023年5月23日
    00
  • sqlmap之os shell图文详细解析

    让我来详细讲解“sqlmap之os shell图文详细解析”的完整攻略。 SQLMap之OS Shell图文详细解析 什么是SQLMap SQLMap是一个用于检测和利用SQL注入漏洞的开源工具,可以自动化地进行注入测试,并且提供了多种手段来发现和利用漏洞,是渗透测试中非常实用的工具之一。SQLMap完全基于Python开发,支持Linux和Windows操…

    C 2023年5月23日
    00
  • C++内嵌汇编示例详解

    对于C++内嵌汇编示例的详解,可以从以下几个方面进行讲解: 1.概述:什么是内嵌汇编 内嵌汇编是指将汇编代码嵌入到C或C++程序中的技术,可以直接在C++源代码中嵌入汇编语言,通过内嵌汇编可以利用汇编语言的精细化控制实现高效的代码。 2.内嵌汇编说明 在C++中内嵌汇编可以使用asm关键字来实现,类似于以下形式: asm (assembly content)…

    C 2023年5月23日
    00
  • python使用Apriori算法进行关联性解析

    下面详细讲解一下“python使用Apriori算法进行关联性解析”的完整攻略。 一、什么是关联性分析和Apriori算法 1.1 关联性分析 关联性分析(Association Analysis)是一种寻找事物之间依存关系的方法,是数据挖掘领域中的一种常用方法。在销售、广告、推荐等领域具有广泛的应用。 关联性分析的基本目的是找出每个物品之间的关系,比如商品…

    C 2023年5月23日
    00
  • vs2019+win10配置boost库的详细教程

    下面我将为你详细讲解如何在vs2019+win10上配置boost库。 环境准备 在开始配置boost库之前,需要先准备好以下环境: windows10操作系统 Visual Studio 2019 IDE boost库源代码 建议下载完整版的boost库源代码,并解压到一个方便访问的目录下。 配置boost库 1. 编译Boost库 首先需要使用CMD进入…

    C 2023年5月22日
    00
  • IIS7报500.23错误的原因分析及解决方法

    下面是详细讲解“IIS7报500.23错误的原因分析及解决方法”的完整攻略。 IIS7报500.23错误的原因分析及解决方法 问题描述 在使用IIS7发布网站时,可能会遇到HTTP错误500.23 – 内部服务器错误而无法访问网站。这时候就需要进一步了解该错误产生的原因,并采取相应的措施解决该问题。 产生的原因 HTTP错误500.23错误大多是由于应用程序…

    C 2023年5月23日
    00
  • C语言中数据如何存储进内存揭秘

    C语言中数据如何存储进内存揭秘 C语言程序在运行时,需要使用计算机的内存来存储数据。C语言中的数据类型包括整型、浮点型、字符型等等,这些数据类型都有不同的内存分配方式,下面我们就来一一了解。 整型数据内存分配 对于整型数据,C语言会根据数据类型的位数分配不同字节的内存空间。例如,对于int类型的数据,一般分配4个字节的内存空间。这个内存空间会从计算机的内存地…

    C 2023年5月23日
    00
  • C语言比较函数指针

    下面我来详细讲解一下“C语言比较函数指针”的使用攻略。 简介 在C语言中,我们常常需要对数据进行排序、查找等操作,而这些操作通常需要用到比较函数。比较函数指的是能够比较两个元素大小的函数,一般格式为: int compare(const void *a, const void *b); 其中,a和b是待比较的两个元素,函数应该根据需要返回一个整数值: 若a&…

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