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日

相关文章

  • 数据结构串的操作实例详解

    数据结构串的操作实例详解 什么是数据结构串? 数据结构串是由若干个字符按照一定的顺序排列而成的线性结构。可以对串进行许多操作,如子串的截取、串的连接、串的替换等等。 数据结构串的基本操作 串的初始化 为了操作一个串,我们需要先定义一个串并初始化,可以通过以下代码实现: #include <stdio.h> #define MAXSIZE 100 …

    数据结构 2023年5月17日
    00
  • Mysql Innodb存储引擎之索引与算法

    Mysql Innodb存储引擎之索引与算法 MySQL是一款非常受欢迎的关系型数据库,有许多的存储引擎可供选择,其中InnoDB是目前最受欢迎的存储引擎之一。索引是InnoDB存储引擎的一个重要特性,它可以大大提高数据库查询的效率。本文将详细讲解InnoDB存储引擎的索引与算法。 索引 索引是一种数据结构,它将表中的列与对应的行位置组成键值对,以便快速查找…

    数据结构 2023年5月17日
    00
  • JavaScript 数据结构之散列表的创建(2)

    下面是详细讲解“JavaScript 数据结构之散列表的创建(2)”的完整攻略。 散列表(哈希表) 散列表是一种数据结构,使用哈希函数将键映射到索引。散列表可以在常量时间 O(1) 中进行插入、删除和查找操作,但也具有碰撞冲突问题。 碰撞冲突问题 在散列表中,当两个不同的键通过哈希函数映射到了同一个索引位置时,就会发生碰撞冲突问题。解决碰撞冲突问题的方法有很…

    数据结构 2023年5月17日
    00
  • 详解C语言内核中的链表与结构体

    详解C语言内核中的链表与结构体 1. 链表的概念 链表是一种线性数据结构,由多个节点组成,每个节点包含了两部分内容:数据和指针。 链表有多种类型,但其中最常见的是单向链表和双向链表。在单向链表中,每个节点只包含一个指针,它指向下一个节点;在双向链表中,每个节点包含两个指针,一个指向上一个节点,一个指向下一个节点。 链表的特点是可以动态地添加或删除节点,是一种…

    数据结构 2023年5月17日
    00
  • 数据结构基本概念和术语之位字节、字、位串、元素等

    我们先来一一解释数据结构中的基本概念和术语: 1. 位 位是计算机中的最小存储单位,通常表示二进制0或1。8个位组成了1个字节,常用于表示和处理计算机中的文件、数据、程序等。 2. 字节 字节是计算机中的基本存储单位之一,由8个位组成,通常表示1个英文字符或者1个二进制数。在计算机存储中,通常以字节为单位进行数据的存储与传输。 3. 位串 一个由0或1构成的…

    数据结构 2023年5月17日
    00
  • Java面试题冲刺第十九天–数据库(4)

    本篇攻略是针对Java数据库相关面试题的,为了方便浏览,我将其分为以下几个部分: 1. 数据库连接池 在Java开发中,我们使用JDBC连接数据库进行数据操作时,为了提高数据库访问性能,通常会使用数据库连接池技术。常见的数据库连接池有:C3P0、Druid、HikariCP等。 C3P0 C3P0是一个开源的数据库连接池,可以设置最大连接数、最小连接数、最大…

    数据结构 2023年5月17日
    00
  • Python数据结构之翻转链表

    对于“Python数据结构之翻转链表”的完整攻略,我会按照以下顺序进行讲解: 1.什么是链表? 2.如何翻转链表? 3.示例1:翻转一个简单的链表 4.示例2:翻转一个带环的链表 5.如何在Python中实现翻转链表? 接下来,我会详细讲解每个部分。 什么是链表? 链表是一种数据结构,它由一系列的节点组成,每个节点包含了数据和指向下一个节点的指针。链表有很多…

    数据结构 2023年5月17日
    00
  • 深入解析MySQL索引数据结构

    深入解析MySQL索引数据结构 MySQL索引是优化查询效率的重要一环,本文将深入解析MySQL索引数据结构,帮助读者理解MySQL索引原理,并通过两个示例说明不同类型的索引在实际应用中的效果。 索引数据结构 MySQL支持两种类型的索引数据结构:B-Tree索引和Hash索引。 B-Tree索引 B-Tree索引是MySQL常用的索引类型,用于优化WHER…

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