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日

相关文章

  • C/C++经典面试题(附答案)

    首先,我们需要理解“C/C++经典面试题(附答案)”这篇文章的目的。该文章旨在为C/C++开发人员提供一些常见的面试问题,并通过详细的答案解释帮助读者更好地掌握这些问题的解决方法。以下是该文章的攻略: 1. 概述 在文章的开头,我们应该简要介绍该文章的内容概述,例如列出所介绍的问题以及解决方法。同时,我们可以提供一些关于本文的基本信息,例如文章的作者、出版时…

    C 2023年5月23日
    00
  • C语言中extern详细用法解析

    请看下面的完整攻略。 C语言中extern详细用法解析 什么是extern? extern是C语言中的一个关键字,它的作用是用来声明一个变量或者函数的定义是在别的文件中,需要在本文件中进行引用。 extern的语法格式 在C语言中,extern语法格式如下所示: extern data_type variable_name; extern return_ty…

    C 2023年5月23日
    00
  • C++如何删除map容器中指定值的元素详解

    当需要删除map容器中的元素时,可以使用erase()成员函数来实现。erase()函数可以根据指定的key,删除map中的相应元素。下面我们详细讲解C++如何删除map容器中指定值的元素: 方法一:使用迭代器来删除元素 使用迭代器可以方便地遍历map中的元素,并根据需要删除指定的元素。下面是一个删除map中指定元素的示例代码: #include <i…

    C 2023年5月23日
    00
  • C语言详解如何实现顺序栈

    当我们需要实现一个顺序栈时,需要先定义栈结构体,然后实现栈的基本操作,包括入栈、出栈等。以下为具体步骤: 1. 定义栈结构体 定义一个结构体,包含栈的基本属性: typedef struct SeqStack { int *data; // 栈的元素存储空间 int size; // 栈的大小 int top; // 栈顶指针 } SeqStack; 其中,…

    C 2023年5月23日
    00
  • 如何理解C++ 临时变量的常量性

    理解 C++ 中临时变量的常量性需要从以下几个方面入手: 临时变量是什么? 什么是常量性? 如何理解 C++ 中临时变量的常量性? 1. 临时变量是什么? 在 C++ 中,临时变量是指在表达式求值过程中,根据表达式的运算结果临时生成的变量。临时变量通常用于传递函数参数、返回函数结果及运算过程中一些中间变量的存储。 举个例子,如下所示的代码: int sum(…

    C 2023年5月23日
    00
  • Win8.1提示激活windows错误代码 0xC004F074如何解决

    Win8.1提示激活windows错误代码 0xC004F074的解决方式如下: 1. 查看系统是否已激活 可以先检查系统是否已激活,按下Win+R键,输入“slmgr.vbs -xpr”,回车后就能看到系统的激活状态。若提示“Windows 已經激活,產品ID:xxxxx-xxxxx-xxxxx-xxxxx-xxxxx”,则说明系统已激活;若提示“Wind…

    C 2023年5月23日
    00
  • Python编程实现数学运算求一元二次方程的实根算法示例

    Python编程实现数学运算求一元二次方程的实根算法示例 一、前置知识 在实现求解一元二次方程的实根之前,需要掌握以下数学知识: 一元二次方程的标准格式:$ax^2+bx+c=0$ 一元二次方程的求根公式:$x=\frac{-b\pm\sqrt{b^2-4ac}}{2a}$ 二、实现原理 在Python中,可以通过以下步骤实现一元二次方程的实根求解: 从用户…

    C 2023年5月22日
    00
  • Javascript对象属性方法汇总

    Javascript对象属性方法汇总 在Javascript中,对象是一种基本数据类型,它可以用来存储数据和方法。一个对象可以包含多个属性和方法,属性是对象的状态,方法是对象的行为。本文将总结Javascript中常见的对象属性和方法。 对象属性 对象属性描述对象的状态,包括数据属性和访问器属性两种。 数据属性 数据属性描述对象的简单值,包含以下属性: va…

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