C语言实现带头结点的链表的创建、查找、插入、删除操作

C语言实现带头结点的链表的创建、查找、插入、删除操作攻略

一、链表基本概念

链表是一种动态的数据结构,它可以在运行时动态地分配内存,支持数据的插入、删除等操作。链表(Linked List)由多个节点(Node)组成,每个节点包含两部分,一个是数据部分(Data),另一个是指向下一个节点的指针(Next)。

二、带头结点的链表

带头结点的链表是一种特殊的链表,它的头结点不存储任何数据,只是一个哨兵节点,可以简化链表的操作。在插入和删除节点时,只需要调整相邻节点的指针,不需要特判第一个节点和最后一个节点。

三、创建链表

创建链表需要分配内存空间,为每个节点赋值并建立节点之间的关系。对于带头结点的链表,在创建时需要先创建一个头结点,并将其指针域设为空。

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

typedef struct Node {
    int data;
    struct Node *next;
} Node, *LinkedList;

LinkedList createList() {
    LinkedList head = (LinkedList)malloc(sizeof(Node));
    head->next = NULL;
    return head;
}

四、查找节点

在链表中查找一个节点,需要从链表的头结点开始,依次访问各个节点,直到找到目标节点或者链表末尾。如果找到节点,则返回节点指针,否则返回NULL。

Node *findNode(LinkedList list, int x) {
    Node *p = list->next;
    while (p != NULL && p->data != x) {
        p = p->next;
    }
    return p;
}

五、插入节点

在链表中插入一个节点,需要先查找节点的插入位置,然后在该位置的前一个节点后面插入新节点,最后建立新节点与后面节点的关系。

void insertNode(LinkedList list, int x) {
    Node *p = (Node*)malloc(sizeof(Node));
    p->data = x;
    p->next = NULL;

    Node *prev = list;
    Node *cur = list->next;
    while (cur != NULL && cur->data < x) {
        prev = cur;
        cur = cur->next;
    }
    p->next = prev->next;
    prev->next = p;
}

例如,现在有一个升序的链表1->3->5->7,需要在其中插入数值为4的节点,插入后的链表为1->3->4->5->7。

LinkedList list = createList();
insertNode(list, 1);
insertNode(list, 3);
insertNode(list, 5);
insertNode(list, 7);
insertNode(list, 4);
// 遍历链表
Node *p = list->next;
while (p != NULL) {
    printf("%d ", p->data);
    p = p->next;
}

六、删除节点

在链表中删除一个节点,需要先查找节点的位置,然后从链表中摘除该节点,并将其内存空间释放。

void deleteNode(LinkedList list, int x) {
    Node *prev = list;
    Node *cur = list->next;
    while (cur != NULL && cur->data != x) {
        prev = cur;
        cur = cur->next;
    }
    if (cur != NULL) {
        prev->next = cur->next;
        free(cur);
    }
}

例如,现在有一个升序的链表1->3->5->7,需要删除数值为5的节点,删除后的链表为1->3->7。

LinkedList list = createList();
insertNode(list, 1);
insertNode(list, 3);
insertNode(list, 5);
insertNode(list, 7);
deleteNode(list, 5);
// 遍历链表
Node *p = list->next;
while (p != NULL) {
    printf("%d ", p->data);
    p = p->next;
}

七、总结

带头结点的链表是一种常用的数据结构,能够动态地分配内存空间,支持插入和删除等操作。在进行操作时,需要考虑到头结点等特殊情况,并利用指针建立节点之间的联系,从而完成链表的创建、查找、插入、删除等操作。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言实现带头结点的链表的创建、查找、插入、删除操作 - Python技术站

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

相关文章

  • 【ACM博弈论】SG函数入门(2):博弈树SG函数的转移与子游戏的合并

    上一篇文章我们讲了两种经典的博弈模型:《【ACM博弈论】SG函数入门(1):从巴什博奕到尼姆游戏》,这一节我们开始讲解SG函数。 ? 作者:Eriktse? 简介:19岁,211计算机在读,现役ACM银牌选手?力争以通俗易懂的方式讲解算法!❤️欢迎关注我,一起交流C++/Python算法。(优质好文持续更新中……)?? 阅读原文获得更好阅读体验:https:…

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

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

    数据结构 2023年5月17日
    00
  • C语言数据结构与算法时间空间复杂度基础实践

    C语言数据结构与算法时间空间复杂度基础实践攻略 基本概念 时间复杂度:算法在执行时所需要的基本操作数,通常用O(n)表示,其中n是输入数据的规模。时间复杂度越小,算法执行所需要的时间越少,算法效率越高。 空间复杂度:算法在执行时所需要的额外空间数,通常用O(S)表示,其中S是额外的空间数。空间复杂度越小,所需的额外空间越少,算法的内存效率越高。 实践步骤 1…

    数据结构 2023年5月17日
    00
  • C语言数据结构算法基础之循环队列示例

    标题:C语言数据结构算法基础之循环队列示例 1. 简介 循环队列是一种常见的数据结构,它采用固定大小的数组来模拟队列的数据结构,可以高效地处理队列的进出操作。本文将会讲解循环队列的实现原理和示例代码。 2. 循环队列基本原理 循环队列通过两个指针front和rear来实现队列的添加和删除操作。在初始化时,front和rear的初始值都为0。每当数据进入队列时…

    数据结构 2023年5月17日
    00
  • C语言结构体struct详解

    C语言结构体struct详解 什么是结构体? 在C语言中,结构体是一种用户自定义的数据类型,它可以将不同的数据类型组合在一起形成一个新的数据类型。结构体主要由结构体名、成员和符号构成。 使用结构体可以方便地定义一些复杂的数据类型,例如表示一个学生信息的数据类型,可以包括姓名、学号、性别、年龄等信息。 结构体的定义和声明 结构体的定义通常放在函数外部,以便在整…

    数据结构 2023年5月17日
    00
  • C语言学习之链表的实现详解

    下面我将详细讲解“C语言学习之链表的实现详解”的完整攻略。 1. 链表的定义 链表是一种数据结构,它由一系列节点组成。每个节点由一个数据部分和一个指向下一个节点的地址部分组成。链表可以有多种形式,例如单向链表、双向链表、循环链表等。 2. 链表的实现 2.1. 单向链表 单向链表是最简单的链表形式,一个节点只包含一个指向下一个节点的指针。在C语言中,我们可以…

    数据结构 2023年5月17日
    00
  • Android Map数据结构全面总结分析

    Android Map数据结构全面总结分析 Map是Android开发中常用的集合类之一,它可以存储键值对,也被称为关联数组或字典。在这篇文章中,我们将深入了解Android Map数据结构,包括Map的基本用法、Map中常用的API以及一些示例说明。 基本用法 Map是一个接口,它的实现包括HashMap、TreeMap、LinkedHashMap等。以下…

    数据结构 2023年5月17日
    00
  • Java 数据结构与算法系列精讲之哈希算法实现

    Java 数据结构与算法系列精讲之哈希算法实现 什么是哈希算法? 哈希算法是一种能将任意长度的消息压缩到某一固定长度的消息摘要的算法。 通过哈希算法,我们可以将一个任意的大数据量压缩成一段固定长度的数据,这个数据的长度通常比较小,相对于原数据的大小来说,要小得多。哈希算法的压缩特性使得它经常用来进行信息摘要、数据校验、唯一识别等功能,可以很大程度上提高数据的…

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