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日

相关文章

  • C语言数据结构之vector底层实现机制解析

    C语言数据结构之vector底层实现机制解析 什么是vector? vector是C++标准库中的一种容器,可以动态调整大小,用于存储数据。 vector的底层实现机制 vector实际上是通过数组实现的,当需要添加元素时,如果当前数组已满,就会重新创建一个更大的数组,并将原数组中的元素复制到新数组中。这样,内存空间得到了增加,同时操作后的元素仍然是顺序存储…

    数据结构 2023年5月17日
    00
  • 手写 Vue3 响应式系统(核心就一个数据结构)

    下面是手写 Vue3 响应式系统的完整攻略。 1. 概述 Vue3 的响应式系统使用了 Proxy 对象来监测对象的变化,相较于 Vue2 的响应式系统使用 Object.defineProperty 进行数据劫持,Proxy 具有更好的性能和更简洁的 API。 当我们修改 Vue3 中的 reactive 对象内部的数据时,就会触发依赖收集和派发更新的操作…

    数据结构 2023年5月17日
    00
  • 带头节点的单链表的思路及代码实现

    带头节点的单链表的思路及代码实现(JAVA) 一、什么是的单链表 ①标准定义 单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) +指针(指示后继元素存储位置,元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。) 以上是标准定义不太好让人对单链表有直观…

    算法与数据结构 2023年4月17日
    00
  • 手撕HashMap(二)

    这里再补充几个手撕HashMap的方法 1、remove() remove 方法参数值应该是键值对的键的值,当传入键值对的键的时候,remove 方法会删除对应的键值对 需要利用我们自己先前创建的 hashcodeList 来实现,hashcodeList 存入了所有被使用的 hashcode 值,方便后续的操作 在 put() 中,当添加新的键值对时,就会…

    算法与数据结构 2023年4月18日
    00
  • Java数据结构之KMP算法的实现

    Java数据结构之KMP算法的实现 1. KMP算法的概述 KMP算法的全称是Knuth-Morris-Pratt算法,是一种字符串匹配算法,用于在文本串S内查找一个模式串P的出现位置。它的特点是在P和S两个序列中,当匹配失败时,它会跳过P的部分已匹配的字符,利用这个信息来减少S和P之间的匹配次数,从而提高匹配效率。 2. KMP算法的实现 2.1 预处理失…

    数据结构 2023年5月17日
    00
  • C语言详解数据结构与算法中枚举和模拟及排序

    我们一步步来详细讲解“C语言详解数据结构与算法中枚举和模拟及排序”的完整攻略。 纲要 本文的主要内容包括: 枚举的概念及应用 模拟的概念及应用 排序的概念及分类 枚举的概念及应用 枚举是一种数据类型,可以将一组具有相关性质的常量定义为枚举常量。枚举常量默认是按照自然数递增的顺序进行编号的。枚举常量可以用于表示状态、类型、结果等概念。以下是一个枚举类型的定义:…

    数据结构 2023年5月17日
    00
  • C数据结构中串简单实例

    下面我将为您详细讲解C语言中串的简单实例。 1. 什么是串 在C语言中,串(String)是由一系列字符组成的序列,是一种常见的数据类型。在C语言中,串通常是以字符数组(Char Array)的方式进行存储的。 2. 定义和初始化串 在C语言中,定义和初始化串可以通过以下方式进行: #include <stdio.h> #include <…

    数据结构 2023年5月17日
    00
  • 第14届蓝桥杯C++B组省赛题解(A-J)(更新完毕)

    目录 A. 日期统计 题目内容 思路 代码 答案 B.01 串的熵 题目内容 思路 代码 答案 C.冶炼金属 题目内容 输入格式 输出格式 输入样例 输出样例 思路 代码 D.飞机降落 题目内容 输入格式 输出格式 输入样例 输出样例 思路 代码 E.接龙数列 题目内容 输入格式 输出格式 输入样例 输出样例 思路 代码 F.岛屿数量 题目内容 输入格式 输…

    算法与数据结构 2023年4月25日
    00
合作推广
合作推广
分享本页
返回顶部