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语言手写集合List的示例代码

    下面是详细讲解如何手写C语言的集合List,并附带两个示例。 什么是集合List? 集合是一种数据结构,它可以存储任意类型的数据,并且可以动态地添加、删除和查询数据。其中最常见的集合是列表(List),它可以存储一组相同或不同类型的数据,并且可以根据需要进行扩展和缩减。 List的实现 下面介绍一下如何使用C语言手写一个List。一个List由一个指针和一个…

    C 2023年5月24日
    00
  • C语言代码实现简单的扫雷小游戏

    C语言代码实现简单的扫雷小游戏 一、游戏规则 扫雷是一款经典的单人益智小游戏,游戏场景是一个区块是由许多个格子组成的矩形网格,有一部分格子下面隐藏着地雷,玩家通过揭露不带雷的部分,最终找到所有地雷的位置。 具体游戏规则: 鼠标左键点开或标记可疑格子。 若点击的是地雷,则游戏结束,显示所有地雷的位置。 若点击的是数字,则显示周边8个格子中地雷的数量。 若点击的…

    C 2023年5月23日
    00
  • C/C++中退出线程的四种解决方法

    下面是关于C/C++中退出线程的四种解决方法的详细攻略: 1. 线程函数自行退出 最常用的方法是让线程函数自行退出,这可以通过return语句或pthread_exit函数来实现。在函数执行完毕后,线程会自动退出并等待被回收。示例代码如下: #include <stdio.h> #include <pthread.h> void *t…

    C 2023年5月22日
    00
  • Notepad++ 运行 C 代码(MinGW-m64)

    Notepad++ 是一个常用的文本编辑器,它支持很多编程语言,包括 C 语言,同时它也很方便与其他工具配合使用。本攻略将介绍如何在 Notepad++ 中使用 MinGW-m64 工具集来编译并运行 C 代码,具体步骤如下: 步骤一:安装 MinGW-m64 工具集 MinGW(Minimalist GNU for Windows)是一个使用 GNU 工具…

    C 2023年5月22日
    00
  • C语言指向非常量的常量指针

    首先我们需要了解一下指针和常量的概念。 指针是一个变量,存储的是一个地址,指向另一个变量的内存位置。指针可以用来操作、访问被指向变量的值,同时也可以修改该值。而常量则是一种不可变的量,它的值在定义后不会再改变。 常量指针是指一个指针,它指向的值是不可变的。常量指针可以用来指向常量,它可以通过指针来访问常量的值,但不能通过指针来修改常量的值。 而“指向非常量的…

    C 2023年5月9日
    00
  • Java 详解异常的处理机制

    Java 详解异常的处理机制 在 Java 编程中,异常处理机制是一项重要的功能,它可以让我们更好地控制程序的运行过程,并避免由于意外情况导致程序崩溃或者异常退出。在本文中,我们将详细讲解 Java 中的异常处理机制,并提供一些实际的代码示例来帮助你理解这一机制的使用方法。 异常的类型 在 Java 中,异常分为两种类型:受检异常(checked excep…

    C 2023年5月23日
    00
  • 如何在C++中调用python代码你知道吗

    当我们需要在 C++ 项目中调用 Python 代码时,可以通过内置的 Python 解释器来实现。以下是在 C++ 中使用 Python 的完整攻略: 步骤一:安装Python解释器 首先需要安装 Python 解释器。我们可以从官网下载并安装最新版本的 Python,也可以使用 Anaconda 等发行版。安装完成之后,需要将 Python 的路径添加到…

    C 2023年5月23日
    00
  • 文明6弹出0xc0000022错误怎么办 错误码0xc0000022解决方法

    文明6弹出0xc0000022错误怎么办 症状描述 文明6在启动时弹出0xc0000022错误提示框,导致游戏无法启动。 错误码0xc0000022解决方法 0xc0000022错误通常是由于文件权限问题引起。以下是解决方法: 1. 游戏文件权限设置 尝试将游戏安装目录及子目录的所有文件和文件夹权限设置为与当前登录用户相同。 具体步骤是: 右键单击游戏安装目…

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