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

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日

相关文章

  • 查询json的数据结构的8种方式简介

    查询json的数据结构的8种方式简介 在处理JSON数据时,经常需要提取特定的数据或获取某个属性的值。这时候就需要使用JSON的查询语言来进行查询操作。本文将介绍8种常用的JSON查询方式,帮助大家更方便、快捷地查询和分析JSON数据。 1. 点语法 使用点语法(.)查询JSON数据是最简单、最常用的方式,通过指定属性名来获取相应的值。例如,假设有以下的JS…

    数据结构 2023年5月17日
    00
  • C++数据结构AVL树全面分析

    C++数据结构AVL树全面分析 简介 AVL树是一种二叉搜索树,它通过使树保持高度平衡来提高搜索、插入和删除操作的效率。AVL树本质上是通过在插入和删除节点时旋转子树来保持平衡的。AVL树被认为是最早的自平衡二元搜索树。 AVL树的定义 AVL树是一种满足以下特性的BST: 每个节点都有一个左子树和一个右子树,并且左子树、右子树也是AVL树。 左子树高度和右…

    数据结构 2023年5月17日
    00
  • C语言数据结构之堆排序的优化算法

    C语言数据结构之堆排序的优化算法攻略 堆排序简介 堆排序(HeapSort)是一种树形选择排序,在排序过程中始终保持一个最大堆,每次将堆顶元素与最后一个元素交换位置,并进行一次最大堆调整操作,直到整个序列有序为止。 堆排序的时间复杂度为O(nlogn),具有不需额外存储空间的特点,因此广泛应用于内存受限的场景。 堆排序的优化算法 1. 建堆操作的优化 将序列…

    数据结构 2023年5月17日
    00
  • Java 数据结构算法Collection接口迭代器示例详解

    Java 数据结构算法 Collection 接口迭代器示例详解 如果你正在学习 Java 编程,那么数据结构和算法一定是一个不可避免的话题。在 Java 中,Collection 框架提供了许多有用的接口和类来管理和操作集合。其中,迭代器 Iterator 是 Collection 中最重要的接口之一,它提供了对集合元素进行迭代的方法。本文将对 Java …

    数据结构 2023年5月17日
    00
  • JavaScript数据结构之栈实例用法

    JavaScript数据结构之栈实例用法 本文将会介绍栈在JavaScript中的实例用法以及栈作为一种数据结构的基本概念。 栈的定义 栈是一种遵从后进先出(LIFO)原则的有序集合。新添加或待删除的元素都保存在栈的同一端,称作栈顶,另一端称作栈底,不含任何元素的栈称为空栈。 栈的应用场景 栈其应用场景是非常广泛的。在现实世界中,许多普通的场景都可以使用栈作…

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

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

    算法与数据结构 2023年4月25日
    00
  • Java数据结构之有向图的拓扑排序详解

    下面我将为您详细讲解“Java数据结构之有向图的拓扑排序详解”的完整攻略。 拓扑排序概述 拓扑排序是一种常见的有向无环图(DAG)的排序方法,该算法将DAG图中所有节点排序成一个线性序列,并且使得所有的依赖关系都满足从前向后的顺序关系。一般来说,DAG图的所有节点可以表示为一个任务依赖关系,而拓扑排序则可以对这些任务进行排序,确保每个任务在它所依赖的任务之后…

    数据结构 2023年5月17日
    00
  • Java数据结构学习之二叉树

    Java数据结构学习之二叉树 什么是二叉树 二叉树是一种树形数据结构,他的每个节点最多有两个子节点,分别称为左子节点和右子节点。如果一个节点没有子节点,则成为叶子节点。二叉树具有以下性质: 每个节点最多有两个子节点 左子树和右子树是二叉树 二叉树可以为空 二叉树的遍历 为了遍历一棵树,我们可以采用两种算法: 深度优先遍历 深度优先遍历的思路是:从根节点出发,…

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