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日

相关文章

  • 数据结构 红黑树的详解

    数据结构:红黑树的详解攻略 一、红黑树的定义 红黑树是一种二叉搜索树,它在每个节点上增加了一个存储位来表示节点的颜色,可以是红色或黑色。红黑树的特征是对于任何有效的红黑树,从根到叶子结点或空子结点的每条路径都包含相同数目的黑色结点。 二、插入操作 对于新插入的节点,将其涂红并插入红黑树中,然后按照二叉搜索树的规则将其插入到红黑树中。 如果父节点是黑色,则不需…

    数据结构 2023年5月17日
    00
  • JoshChen_php新手进阶高手不可或缺的规范介绍

    JoshChen_php新手进阶高手不可或缺的规范介绍 作为一名PHP程序员,熟练掌握编程语言的同时,规范的代码风格也是不可或缺的。本文将介绍一些PHP规范的相关内容,帮助PHP新手进阶为高手。 1. 代码风格规范 1.1. 缩进 在编写代码时,缩进是非常重要的。按照规范,我们应该在每个缩进级别使用4个空格。 1.2. 命名规范 在PHP中,我们应该遵循以下…

    数据结构 2023年5月17日
    00
  • C语言数据结构之动态分配实现串

    C语言数据结构之动态分配实现串 序言 在本文中,我们将探讨C语言中动态分配实现串的方法和技巧。本文将会从什么是动态分配串开始,详细介绍如何实现动态分配串,并给出一些示例代码帮助读者更好地理解。 什么是动态分配串 一个串(string)是由零个或多个字符组成的有限序列。串的实现可以分为两种形式:静态分配和动态分配。动态分配串是指在运行时动态地分配内存,以适应不…

    数据结构 2023年5月17日
    00
  • 浅谈iOS 数据结构之链表

    浅谈iOS 数据结构之链表 在计算机科学中,链表是一种数据结构,用于存储一系列按顺序排列的元素。链表的一个关键点是它不需要连续的内存空间来存储元素,相反,每个元素由一个指向下一个元素的指针组成。在iOS开发中,链表在各种场景下都有所应用,如UITableView和UICollectionView的数据源等。本文将详细讲解链表的基本知识和使用技巧。 链表的基本…

    数据结构 2023年5月17日
    00
  • C语言数据结构 快速排序实例详解

    C语言数据结构 快速排序实例详解 什么是快速排序? 快速排序(Quicksort)是一种采用分治法(Divide and Conquer)的排序算法,通过将一个大问题逐步分解为小问题来解决的一种工具。 快速排序是一个比较快的排序算法,在平均状况下,排序n个项目要 O(n log n) 次比较,最坏情况下需要O(n^2)次比较,但这种状况并不常见。 快速排序算…

    数据结构 2023年5月17日
    00
  • Java数据结构之双向链表的实现

    Java数据结构之双向链表的实现 一、双向链表的定义 双向链表是一种包含两个指针的链表数据结构,每个节点都有两个指针,一个指向前一个节点,一个指向后一个节点。 二、双向链表的实现 1. 定义节点 首先,我们需要定义一个节点类,包含节点的值,指向前一个节点的指针pre和指向后一个节点的指针next,代码如下: public class Node { int v…

    数据结构 2023年5月17日
    00
  • 如何配置git环境

    首先我们新建一个文件夹;    然后我们右键git Bash Here一下;在里面输入: cd ssh-keygen cd.ssh ls (注意,我们要是之前就生成过密钥,直接输入ls就好了) 输入ls之后,会显示出来我们的公钥,我们输入: cat id_rsa.pub 然后密钥就出来了,密钥出来之后,我们把密钥复制一下,打开github 选择设置; 中会有…

    算法与数据结构 2023年4月18日
    00
  • C语言全面梳理结构体知识点

    C语言全面梳理结构体知识点 什么是结构体? 结构体是一种自定义的数据类型,它可以包含多个不同类型的成员变量,并且这些成员变量可以通过一个变量名来访问。结构体的定义需要使用关键字struct,并且需要指定结构体的类型名和成员变量。例如: struct Person { char name[20]; int age; float height; }; 以上代码就…

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