C语言数据结构之单链表操作详解

yizhihongxing

C语言数据结构之单链表操作详解

本文将详细讲解C语言数据结构中单链表的操作方法,包括单链表的建立、遍历、插入、删除等操作,并提供两个示例进行说明。

单链表的定义

单链表是一种常见的动态数据结构,由若干节点组成,每个节点通常包含一个数据元素和一个指向下一个节点的指针。单链表最后一个节点的指针指向NULL,表示链表的结尾。

单链表的节点定义

单链表的节点通常由结构体定义,包含数据和指向下一个节点的指针。定义如下:

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

其中,data表示节点的数据,next指向下一个节点。

单链表的建立

单链表的建立过程即为不断插入节点的过程,通过设置一个指向头节点的指针,不断向其中添加节点即可。

PNode CreateLinkedList(int n)
{
    PNode head, p, q;
    int i;

    head = (PNode)malloc(sizeof(Node));
    head->next = NULL;

    q = head;

    for (i = 0; i < n; i++)
    {
        p = (PNode)malloc(sizeof(Node));
        printf("请输入第%d个节点的值:", i+1);
        scanf_s("%d", &p->data);
        q->next = p;
        q = p;
    }
    p->next = NULL;

    return head;
}

上述代码中,先创建一个指向头节点的指针head(初始指向NULL),再依次循环添加节点,每次添加时需要按照如下方式进行:

  1. 创建新节点p;
  2. 设置p的数据值;
  3. 将节点p加入到链表中,即将p链接到q的后面;
  4. 将q指向p,更新q的位置。

单链表的遍历

遍历单链表的过程即为顺序访问每个节点的过程,通常使用while循环来实现。

void TraverseLinkedList(PNode head)
{
    PNode p = head->next;

    while (p != NULL)
    {
        printf("%d ", p->data);
        p = p->next;
    }
    printf("\n");
}

上述代码中,先将指针p指向第一个节点,然后依次输出每个节点的数据值,直到p指向NULL结束。

单链表的插入

单链表的插入操作即为在链表中加入新节点的过程。新节点插入到链表中间时,必须先找到其前驱节点,再进行链接操作。

int InsertLinkedList(PNode head, int i, int x)
{
    PNode p = head, q;
    int j = 0;

    while (p != NULL && j < i - 1)
    {
        p = p->next;
        j++;
    }

    if (p == NULL || j > i - 1)
    {
        return 0;
    }

    q = (PNode)malloc(sizeof(Node));
    q->data = x;
    q->next = p->next;
    p->next = q;

    return 1;
}

上述代码中,先找到第i个节点的前驱节点p,然后创建新节点q,并将其链接到p的后面,最终返回1表示插入成功,返回0表示插入失败。

单链表的删除

单链表的删除操作即为删除链表中某个节点的过程。删除节点时,必须找到其前驱节点,并将前驱节点与后继节点链接起来。

int DeleteLinkedList(PNode head, int i)
{
    PNode p = head, q;
    int j = 0;

    while (p->next != NULL && j < i - 1)
    {
        p = p->next;
        j++;
    }

    if (p->next == NULL || j > i - 1)
    {
        return 0;
    }

    q = p->next;
    p->next = q->next;
    free(q);

    return 1;
}

上述代码中,先找到第i个节点的前驱节点p,然后将p与q的后继节点链接起来,最终删除节点q。

示例1

例如,现有如下节点已经按顺序插入到链表中:1 2 3 4 5,若要在第3个节点后插入节点6,可按照如下方式实现:

PNode head = CreateLinkedList(5);
printf("插入前:");
TraverseLinkedList(head);

InsertLinkedList(head, 3, 6);
printf("插入后:");
TraverseLinkedList(head);

输出结果如下:

请输入第1个节点的值:1
请输入第2个节点的值:2
请输入第3个节点的值:3
请输入第4个节点的值:4
请输入第5个节点的值:5
插入前:1 2 3 4 5 
插入后:1 2 3 6 4 5 

示例2

再如,现有如下节点已经按顺序插入到链表中:1 2 3 4 5,若要删除第2个节点,可按照如下方式实现:

PNode head = CreateLinkedList(5);
printf("删除前:");
TraverseLinkedList(head);

DeleteLinkedList(head, 2);
printf("删除后:");
TraverseLinkedList(head);

输出结果如下:

请输入第1个节点的值:1
请输入第2个节点的值:2
请输入第3个节点的值:3
请输入第4个节点的值:4
请输入第5个节点的值:5
删除前:1 2 3 4 5 
删除后:1 3 4 5 

以上为单链表的建立、遍历、插入、删除等基本操作详解,并提供两个示例进行说明。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言数据结构之单链表操作详解 - Python技术站

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

相关文章

  • C++ 数据结构之布隆过滤器

    C++ 数据结构之布隆过滤器 简介 布隆过滤器是一种用于快速判断一个元素是否存在于一个集合中的数据结构。它的空间效率和查询效率都比较高,在某些场景下,它可以代替传统的哈希表。 原理 布隆过滤器的基本原理是:将一个元素映射为多个位数组中的位置。在插入元素时,将这些位置上的值设置为1;在查询元素时,如果这些位置上的值都为1,则认为元素存在于集合中;否则认为元素不…

    数据结构 2023年5月17日
    00
  • 环形队列的实现 [详解在代码中]

    1 package DataStructures.Queue.Array.Exerice; 2 3 /** 4 * @author Loe. 5 * @project DataStructures&Algorithms 6 * @date 2023/5/8 7 * @ClassInfo 环形队列 8 * 主要使用取模的特性来实现环形特征 9 */ 1…

    算法与数据结构 2023年5月8日
    00
  • 数据结构C语言链表的实现介绍

    数据结构C语言链表的实现介绍 1. 什么是链表? 链表是一种常见的数据结构,它由一系列的节点(Node)通过链接(Link)组成,每个节点包含两个部分:数据域(Data)和指针(Pointer),数据域用来存储数据,指针用来链接下一个节点。链表最重要的优点就是支持动态扩展,占用内存比较灵活,相比于数组,链表在增加和删除元素时更加高效。 2. 链表的实现 链表…

    数据结构 2023年5月17日
    00
  • go语言数据结构之前缀树Trie

    前缀树Trie 前缀树Trie是一种树形数据结构,被用于快速查找内存中的字符串数据。它非常适合存储大量的字符串,并且能够非常快速的查找以一个指定的字符串前缀开头的全部字符串。 相关术语 在学习前缀树Trie之前,需要掌握一下相关术语: 根节点:Trie树的根节点,代表空字符串。 边:连接两个节点的线,代表一个字符。 节点:表示一个字符串,可能是某个字符串的结…

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

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

    算法与数据结构 2023年4月17日
    00
  • C语言数据结构之算法的时间复杂度

    关于C语言数据结构之算法的时间复杂度,需要先了解一些基本概念。 什么是时间复杂度 时间复杂度是算法的一种衡量标准,用于评估算法的执行效率。表示代码执行的时间和数据量之间的关系,通常用大O符号来表示,称为“大O记法”。 时间复杂度的分类 时间复杂度可分为以下几类: 常数阶:O(1) 对数阶:O(log n) 线性阶:O(n) 线性对数阶:O(n log n) …

    数据结构 2023年5月17日
    00
  • 集合框架及背后的数据结构

    集合框架及背后的数据结构 集合框架是Java编程语言中的一组接口和实现类,用于存储数据的集合。集合框架中提供了许多不同类型的集合,包括List、Set、Map等。背后的数据结构是实现集合框架的关键,不同的数据结构适用于不同的集合类型和场景。 集合框架中的接口和实现类 Java中的集合框架定义了一些接口以及这些接口的实现类,在使用Java集合的时候,主要是使用…

    数据结构 2023年5月17日
    00
  • C++数据结构之链表的创建

    C++中链表的创建一般可分为以下几个步骤: 创建节点结构体 创建链表类,定义私有变量头结点(head)和一些公有方法,如插入、删除和打印链表等 实现链表的插入、删除和打印方法 下面将会对以上每个步骤进行详细讲解。 1. 创建节点结构体 节点结构体包含两个部分,一个是存储数据的变量,另一个是存储指向下一个节点的指针。代码如下: struct Node { in…

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