C语言线性表之双链表详解

C语言线性表之双链表详解

前言

本教程将详细介绍C语言中双链表的实现方法以及相关操作,适合有一定C语言基础的读者。

双链表定义

双链表是一种常见的数据结构,与单链表不同,双链表中每个节点不仅有指向后续节点的指针,还有指向前续节点的指针,即“双向链表”。

双链表的节点结构体可以定义如下:

typedef struct double_node{
    int data;
    struct double_node *prev;
    struct double_node *next;
}DoubleNode;

其中,data表示节点中存储的数据,prev指向前续节点,next指向后续节点。

双链表操作

初始化双链表

在使用双链表前,需要先初始化一个空表头。代码如下:

DoubleNode* init_double_list(){
    DoubleNode* head=(DoubleNode*)malloc(sizeof(DoubleNode));
    head->next=NULL;
    head->prev=NULL;
    return head;
}

在双链表中插入节点

有两种在双链表中插入节点的方法:在表头插入节点和在表尾插入节点。

1.在表头插入节点

在双链表表头插入节点的代码如下:

void insert_head(DoubleNode* list,int data){
    DoubleNode* new_node=(DoubleNode*)malloc(sizeof(DoubleNode));
    new_node->data=data;
    new_node->next=list->next;
    new_node->prev=list;
    list->next=new_node;
    if(new_node->next!=NULL){
        new_node->next->prev=new_node;
    }
}

2.在表尾插入节点

在双链表表尾插入节点的代码如下:

void insert_tail(DoubleNode* list,int data){
    DoubleNode* new_node=(DoubleNode*)malloc(sizeof(DoubleNode));
    new_node->data=data;
    new_node->prev=NULL;
    new_node->next=list;
    while(list->next!=NULL){
        list=list->next;
    }
    list->next=new_node;
    new_node->prev=list;
}

在双链表中删除节点

有两种在双链表中删除节点的方法:删除表头节点和删除表尾节点。

1.删除表头节点

在双链表表头删除节点的代码如下:

void delete_head(DoubleNode* list){
    if(list->next!=NULL){
        DoubleNode* temp=list->next;
        list->next=temp->next;
        if(temp->next!=NULL){
            temp->next->prev=list;
        }
        free(temp);
    }
}

2.删除表尾节点

在双链表表尾删除节点的代码如下:

void delete_tail(DoubleNode* list){
    if(list->next!=NULL){
        while(list->next->next!=NULL){
            list=list->next;
        }
        DoubleNode* temp=list->next;
        list->next=NULL;
        free(temp);
    }
}

示例

示例1

以下代码演示了双链表的初始化、在表头插入节点和在表尾插入节点操作:

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

typedef struct double_node{
    int data;
    struct double_node *prev;
    struct double_node *next;
}DoubleNode;

DoubleNode* init_double_list(){
    DoubleNode* head=(DoubleNode*)malloc(sizeof(DoubleNode));
    head->next=NULL;
    head->prev=NULL;
    return head;
}

void insert_head(DoubleNode* list,int data){
    DoubleNode* new_node=(DoubleNode*)malloc(sizeof(DoubleNode));
    new_node->data=data;
    new_node->next=list->next;
    new_node->prev=list;
    list->next=new_node;
    if(new_node->next!=NULL){
        new_node->next->prev=new_node;
    }
}

void insert_tail(DoubleNode* list,int data){
    DoubleNode* new_node=(DoubleNode*)malloc(sizeof(DoubleNode));
    new_node->data=data;
    new_node->prev=NULL;
    new_node->next=list;
    while(list->next!=NULL){
        list=list->next;
    }
    list->next=new_node;
    new_node->prev=list;
}

void print_double_list(DoubleNode* list){
    while(list->next!=NULL){
        printf("%d->",list->next->data);
        list=list->next;
    }
    printf("NULL\n");
}

int main(){
    DoubleNode* list=init_double_list();
    insert_head(list,1);
    insert_head(list,2);
    insert_head(list,3);
    insert_tail(list,4);
    insert_tail(list,5);
    insert_tail(list,6);
    print_double_list(list);
    return 0;
}

输出结果如下:

3->2->1->4->5->6->NULL

示例2

以下代码演示了双链表的在表头删除节点和在表尾删除节点操作:

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

typedef struct double_node{
    int data;
    struct double_node *prev;
    struct double_node *next;
}DoubleNode;

DoubleNode* init_double_list(){
    DoubleNode* head=(DoubleNode*)malloc(sizeof(DoubleNode));
    head->next=NULL;
    head->prev=NULL;
    return head;
}

void insert_head(DoubleNode* list,int data){
    DoubleNode* new_node=(DoubleNode*)malloc(sizeof(DoubleNode));
    new_node->data=data;
    new_node->next=list->next;
    new_node->prev=list;
    list->next=new_node;
    if(new_node->next!=NULL){
        new_node->next->prev=new_node;
    }
}

void insert_tail(DoubleNode* list,int data){
    DoubleNode* new_node=(DoubleNode*)malloc(sizeof(DoubleNode));
    new_node->data=data;
    new_node->prev=NULL;
    new_node->next=list;
    while(list->next!=NULL){
        list=list->next;
    }
    list->next=new_node;
    new_node->prev=list;
}

void delete_head(DoubleNode* list){
    if(list->next!=NULL){
        DoubleNode* temp=list->next;
        list->next=temp->next;
        if(temp->next!=NULL){
            temp->next->prev=list;
        }
        free(temp);
    }
}

void delete_tail(DoubleNode* list){
    if(list->next!=NULL){
        while(list->next->next!=NULL){
            list=list->next;
        }
        DoubleNode* temp=list->next;
        list->next=NULL;
        free(temp);
    }
}

void print_double_list(DoubleNode* list){
    while(list->next!=NULL){
        printf("%d->",list->next->data);
        list=list->next;
    }
    printf("NULL\n");
}

int main(){
    DoubleNode* list=init_double_list();
    insert_head(list,1);
    insert_head(list,2);
    insert_head(list,3);
    insert_tail(list,4);
    insert_tail(list,5);
    insert_tail(list,6);
    print_double_list(list);
    delete_head(list);
    delete_tail(list);
    print_double_list(list);
    return 0;
}

输出结果如下:

3->2->1->4->5->6->NULL
2->1->4->5->NULL

结论

本教程详细介绍了双链表的定义以及相关操作,包括初始化、插入节点、删除节点等。通过示例演示可以更好地理解双链表的相关操作。如果读者已经掌握并理解了本教程的内容,可以尝试在实际项目中应用了解到的知识。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言线性表之双链表详解 - Python技术站

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

相关文章

  • C++数据结构之二叉搜索树的实现详解

    C++数据结构之二叉搜索树的实现详解 1. 什么是二叉搜索树? 二叉搜索树是一种二叉树,其中每个节点都包含一个键值,且每个节点的键值都大于其左子树中任何节点的键值,小于其右子树中任何节点的键值。如下图所示: 9 / \ 4 15 / \ 12 20 在上面的二叉搜索树中,节点的键值分别是9, 4, 15, 12, 20,且每个节点的键值都符合上述定义。 2.…

    数据结构 2023年5月17日
    00
  • C语言数据结构之学生信息管理系统课程设计

    C语言数据结构之学生信息管理系统课程设计 介绍 本文讲解学生信息管理系统的设计过程,包括需求分析、设计思路、实现步骤等。 需求分析 学生信息管理系统是一种常见的数据结构应用场景。通过该系统,可以实现对学生信息的有效管理和查询。在设计之前,我们需要明确系统的需求和功能,包括: 学生信息的录入、删除、修改和查询; 各类信息的统计和分析,如学生总数、男女比例等; …

    数据结构 2023年5月17日
    00
  • Halcon软件安装与界面简介

      1. 下载Halcon17版本到到本地 2. 双击安装包后 3. 步骤如下     界面分为四大块 1.    Halcon的五个助手 1)    图像采集助手:与相机连接,设定相机参数,采集图像 2)    标定助手:九点标定或是其它的标定,生成标定文件及内参外参,可以将像素单位转换为长度单位 3)    模板匹配助手:画取你想寻找的图像,设定参数,可…

    算法与数据结构 2023年4月19日
    00
  • js处理层级数据结构的方法小结

    “JS处理层级数据结构的方法小结”是一篇讲解JavaScript如何处理嵌套数据结构的文章。在现代的web应用中,嵌套结构是非常常见的,比如JSON数据、树形数据等。以下是对该话题的详细讲解: 1. 嵌套数据结构的概念 指的是包含嵌套关系的数据类型,如数组、对象、树形结构、XML文档等。这些类型之间有着固定层级关系,包含多个层次的数据。嵌套数据结构的处理,往…

    数据结构 2023年5月17日
    00
  • 【牛客小白月赛69】题解与分析A-F【蛋挞】【玩具】【开题顺序】【旅游】【等腰三角形(easy)】【等腰三角形(hard)】

    比赛传送门:https://ac.nowcoder.com/acm/contest/52441 感觉整体难度有点偏大。 ? 作者:Eriktse? 简介:19岁,211计算机在读,现役ACM银牌选手?力争以通俗易懂的方式讲解算法!❤️欢迎关注我,一起交流C++/Python算法。(优质好文持续更新中……)?? 个人博客:www.eriktse.com A-蛋…

    算法与数据结构 2023年4月18日
    00
  • R语言数据结构之矩阵、数组与数据框详解

    R语言数据结构之矩阵、数组与数据框详解 在R语言中,矩阵、数组和数据框是常见的数据结构。本文将从定义、创建、访问和操作等方面详细讲解这些数据结构。 矩阵(matrix) 定义 矩阵是R语言中的一种二维数据结构,所有的元素都必须是同一类型的,并且矩阵中的行列数必须相同。矩阵可以使用matrix函数创建。 创建 # 创建一个3行4列的矩阵,所有元素都为0 mat…

    数据结构 2023年5月17日
    00
  • C语言编程数据结构基础详解小白篇

    C语言编程数据结构基础详解小白篇攻略 1. 确定学习目标 在学习过程中,需要明确学习目标。对于小白来说,首先要了解C语言的基本语法,同时也需要掌握常用的数据结构。 2. 学习基本语法 2.1 变量和数据类型 C语言的变量必须先定义后使用 常用的数据类型包括整型、字符型、浮点型等 2.2 控制流程 C语言中常用的控制流程包括条件语句和循环语句 条件语句包括if…

    数据结构 2023年5月17日
    00
  • C语言全面讲解顺序表使用操作

    C语言全面讲解顺序表使用操作 什么是顺序表 顺序表(Sequential List)是一种常见的数据结构,它由一组连续的存储单元组成,并且支持随机访问。通常我们使用数组来实现顺序表。 顺序表的基本操作 初始化 在使用顺序表之前,需要先进行初始化。顺序表的初始化包括两个步骤:指定顺序表的大小,申请内存空间。具体代码如下: #define MAXSIZE 100…

    数据结构 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部