C语言数据结构实例讲解单链表的实现

C语言数据结构实例讲解单链表的实现

单链表是一种线性的数据结构,它由一系列节点组成,每个节点都包含一个数据域和一个指向下一个节点的指针域。单链表常用于需要频繁插入删除元素的场景中。

单链表的数据结构设计

在C语言中,我们可以使用结构体来定义单链表的节点:

typedef struct node {
    int data;          // 数据域
    struct node* next; // 指针域
} Node;

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

常见的单链表操作包括创建链表、插入节点、删除节点、遍历链表等。

创建链表

创建一个空链表可以使用以下代码:

Node* createList() {
    Node* head = (Node*)malloc(sizeof(Node)); // 创建头节点
    head->next = NULL;                        // 头节点不存储数据,指向NULL
    return head;
}

在创建链表时,我们首先需要创建一个头节点,通常情况下头节点不存储数据,只是为了方便操作链表。创建头节点后,将其指向NULL即可。

插入节点

可以通过以下代码在链表的指定位置插入一个节点:

int insertNode(Node* head, int index, int data) {
    Node* p = head;
    int i = 0;
    while (p && i < index - 1) { // 找到要插入位置的前一个节点
        p = p->next;
        i++;
    }
    if (!p || i > index - 1) {   // 没有找到指定位置,插入失败
        return 0;
    }
    Node* node = (Node*)malloc(sizeof(Node)); // 创建新的节点
    node->data = data;
    node->next = p->next;        // 插入节点
    p->next = node;
    return 1;
}

该函数接受三个参数:head表示链表的头节点,index表示要插入的位置,data表示要插入的数据。

在插入节点时,我们需要找到要插入位置的前一个节点,并将新节点插入前一个节点和后一个节点之间即可。

删除节点

可以使用以下代码删除链表中的指定节点:

int deleteNode(Node* head, int index) {
    Node* p = head;
    int i = 0;
    while (p && i < index - 1) { // 找到要删除节点的前一个节点
        p = p->next;
        i++;
    }
    if (!p || !p->next || i > index - 1) { // 没有找到指定节点,删除失败
        return 0;
    }
    Node* q = p->next;  // 删除节点
    p->next = q->next;
    free(q);
    return 1;
}

该函数接受两个参数:head表示链表的头节点,index表示要删除的节点位置。

在删除节点时,我们需要找到要删除节点的前一个节点,并将其指向要删除节点的下一个节点即可。

示例说明

下面通过两个示例来说明如何使用单链表实现数据结构。

示例1:实现栈

栈是一种后进先出的数据结构,通常可以使用单链表来实现。我们可以使用链表头作为栈顶。

创建栈:

Node* createStack() {
    return createList();
}

入栈操作:

void push(Node* stack, int data) {
    insertNode(stack, 1, data); // 在头节点后插入节点
}

出栈操作:

int pop(Node* stack) {
    int data = stack->next->data;
    deleteNode(stack, 1);  // 删除头节点后面的节点
    return data;
}

示例2:实现队列

队列是一种先进先出的数据结构,通常可以使用单链表来实现。我们可以使用链表尾作为队尾。

创建队列:

Node* createQueue() {
    return createList();
}

入队操作:

void enqueue(Node* queue, int data) {
    Node* node = (Node*)malloc(sizeof(Node));
    node->data = data;
    node->next = NULL;
    Node* p = queue;
    while (p->next) { // 找到链表的尾部
        p = p->next;
    }
    p->next = node;  // 将节点插入到尾部
}

出队操作:

int dequeue(Node* queue) {
    int data = queue->next->data;
    deleteNode(queue, 1); // 删除头节点后的节点
    return data;
}

总结

单链表是一种重要的数据结构,对于程序员来说是必备的技能。掌握了单链表的实现原理,可以为后期的编程工作提供很大帮助。

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

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

相关文章

  • nginx内存池源码解析

    Nginx内存池源码解析 Nginx是一个高性能、高并发的Web服务器。为了提高其性能和速度,Nginx采用了特殊的内存管理机制,即内存池。 什么是内存池? 内存池是一种高效的内存分配和管理机制。它将一块内存划分成多个大小相等的块,并按需分配给系统。当内存块不再使用时,它并不被立即释放,而是留在内存池中待重复利用。 Nginx内存池结构 Nginx内存池主要…

    数据结构 2023年5月17日
    00
  • Go语言数据结构之希尔排序示例详解

    Go语言数据结构之希尔排序示例详解 希尔排序简介 希尔排序,也称为缩小增量排序,是插入排序的一种更高效的改进版本;希尔排序是非稳定排序算法。 希尔排序的基本思想是已距离进行“减半”的插入排序;先将整个待排序的记录序列分割成若干个子序列,分别进行直接插入排序,待各子序列中的记录基本有序时,再将子序列合并为整体有序序列。 希尔排序的过程 从上面的简介中我们可以得…

    数据结构 2023年5月17日
    00
  • 数位dp

    数位dp 思想 一般来说,题目是要求在区间\([l,r]\)中符合某一种条件的数的个数 我们用前缀和的思想考虑,分别求出\([1,r]\)和\([1,l-1]\)中数的个数相减即为所求 这里采用记忆化搜索的方式实现 模板 #include<iostream> #include<cstring> #include<vector&g…

    算法与数据结构 2023年4月17日
    00
  • Redis五种数据结构在JAVA中如何封装使用

    Redis 是一款高性能的键值存储数据库,支持五种不同的数据结构:字符串(String)、哈希(Hash)、列表(List)、集合(Set)和有序集合(Sorted Set)。在Java中使用Redis需要封装对应的数据结构,本文将详细介绍如何封装Redis的五种数据结构。 封装Redis字符串数据结构 Redis字符串数据结构对应Java中的String类…

    数据结构 2023年5月17日
    00
  • Java数据结构之常见排序算法(下)

    Java数据结构之常见排序算法(下) 前言 这是 Java 数据结构之常见排序算法的第二篇,本篇文章将继续介绍常见的排序算法。对于尚未了解基本排序算法的读者,可以先阅读 Java 数据结构之常见排序算法(上)。 快速排序 快速排序是一种使用分治思想的排序算法,其思路是将一个数组分为两个子数组,再对子数组进行排序,这个过程不断递归执行。在具体实现时,选择一个元…

    数据结构 2023年5月17日
    00
  • C#数据结构之顺序表(SeqList)实例详解

    C#数据结构之顺序表(SeqList)实例详解 顺序表(SeqList)概述 顺序表(SeqList)是一种线性表存储结构,它的特点是元素的存储位置是连续的。因为它的存储结构是数组,所以在访问和修改元素时,可以通过数组下标进行快速定位。顺序表在内存中的存储相对紧凑,因此查找和修改效率都很高,适用于大多数元素较少、但是需要频繁访问的场景。 实现顺序表(SeqL…

    数据结构 2023年5月17日
    00
  • 「分治」黑白棋子的移动

    本题为3月23日23上半学期集训每日一题中A题的题解 题面 题目描述 有2n个棋子(n≥4)排成一行,开始位置为白子全部在左边,黑子全部在右边,如下图为n=5的情形: ○○○○○●●●●● 移动棋子的规则是:每次必须同时移动相邻的两个棋子,颜色不限,可以左移也可以右移到空位上去,但不能调换两个棋子的左右位置。每次移动必须跳过若干个棋子(不能平移),要求最后能…

    算法与数据结构 2023年4月18日
    00
  • C语言深入讲解链表的使用

    C语言深入讲解链表的使用 什么是链表? 链表是一种常用的数据结构,它的存储方式是通过指针相互连接实现的。链表是由若干个节点(node)构成的,每个节点都存储着一些信息和指向下一个节点的指针。 链表实现的基本操作 链表的基本操作包括插入节点、删除节点以及遍历链表。我们下面将通过代码示例详细介绍这些操作。 插入节点 链表的插入节点操作是指在链表的某一位置插入一个…

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