C语言 数据结构之链表实现代码

下面就是关于C语言数据结构之链表实现代码的完整攻略。

什么是链表

链表是一种基础的数据结构,它是由一系列的节点所组成,每个节点会包含自己的数据和指向下一个节点的指针。

链表分为单向链表、双向链表和循环链表等多种类型,常见的是单向链表和双向链表。

链表的优点

相对于数组,链表具有下述优点:

  1. 链表的长度可以无限增长,不存在数组固定长度的问题;
  2. 插入和删除元素时,只需要修改指针即可,不必全盘搬移;
  3. 链表适合在前端插入或删除元素,具有较快的操作速度。

链表的缺点

链表也有一些缺点:

  1. 链表的随机访问操作效率低;
  2. 需要额外的内存空间存储指向下一个节点的指针。

单向链表的代码实现

下面我们以单向链表为例,进行链表代码实现的详细讲解。

定义节点结构体

定义一个节点结构体,包含数据域和指向下一个节点的指针。

typedef struct node {
    int data;
    struct node* next;
} Node;

初始化链表

初始化一个链表即是初始化头节点,并将头节点的指针置为 NULL。

Node* head = NULL;

插入节点

向链表中插入节点时,需要注意插入位置。

如果插入头节点之前,则新节点成为新的头节点;

如果插入尾节点之后,则新节点成为新的尾节点;

否则,在中间某个节点之后插入节点。

void insertNode(Node** headRef, int data, int position) {
    int k = 0;
    Node* newNode = malloc(sizeof(Node));
    if (!newNode) {
        printf("Error: Memory could not be allocated.");
        return;
    }
    newNode->data = data;
    Node* current = *headRef;
    if (position == 0) {
        newNode->next = current;
        *headRef = newNode;
        return;
    }
    while (current != NULL && k < position - 1) {
        current = current->next;
        k++;
    }
    if (current == NULL) {
        printf("Error: Insert position is out of range.");
        return;
    }
    newNode->next = current->next;
    current->next = newNode;
}

删除节点

删除链表中的节点时,同样需要注意删除位置。

如果删除头节点,则将头结点的指针后移一个位置即可;

否则,在中间某个节点后删除节点。

void deleteNode(Node** headRef, int position) {
    if (*headRef == NULL) {
        printf("Error: Linked list is empty.");
        return;
    }
    Node* current = *headRef;
    if (position == 0) {
        *headRef = (*headRef)->next;
        free(current);
        return;
    }
    int k = 0;
    while (current != NULL && k < position - 1) {
        current = current->next;
        k++;
    }
    if (current == NULL || current->next == NULL) {
        printf("Error: Deletion position is out of range.");
        return;
    }
    Node* temp = current->next;
    current->next = temp->next;
    free(temp);
}

其他操作

除此之外,也可以定义一些其他的操作函数,如输出链表、寻找节点等。

void printList(Node* head) {
    Node* current = head;
    while (current != NULL) {
        printf("%d->", current->data);
        current = current->next;
    }
    printf("NULL");
}

int findNode(Node* head, int data) {
    int k = 0;
    Node* current = head;
    while (current != NULL) {
        if (current->data == data) {
            return k;
        }
        current = current->next;
        k++;
    }
    return -1;
}

示例说明

示例1:向链表中插入节点

Node* head = NULL;
insertNode(&head, 1, 0); // 向空链表中插入第一个节点
insertNode(&head, 2, 1); // 向链表中插入第二个节点
insertNode(&head, 0, 0); // 向链表首位插入节点
printList(head); // 输出结果: 0->1->2->NULL

示例2:从链表中删除节点

Node* head = NULL;
insertNode(&head, 1, 0);
insertNode(&head, 2, 1);
insertNode(&head, 3, 2);
deleteNode(&head, 1); // 从链表中删除第二个节点
printList(head); // 输出结果: 1->3->NULL

至此,C语言数据结构之链表的代码实现就讲解完成了。

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

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

相关文章

  • 【ACM算法竞赛日常训练】DAY4题解与分析【树】【子序列】| 组合数学 | 动态规划

    DAY4共2题: 树(组合数学) 子序列(dp,数学) ? 作者:Eriktse? 简介:19岁,211计算机在读,现役ACM银牌选手?力争以通俗易懂的方式讲解算法!❤️欢迎关注我,一起交流C++/Python算法。(优质好文持续更新中……)?? 原文链接(阅读原文获得更好阅读体验):https://www.eriktse.com/algorithm/109…

    算法与数据结构 2023年4月18日
    00
  • C语言数据结构旋转链表的实现

    C语言数据结构旋转链表的实现 1. 什么是旋转链表 旋转链表是一种特殊的链表,其特点是将链表的最后一个节点移动到最前面,形成一个环形链表的效果。比如下面这个链表: 1 -> 2 -> 3 -> 4 -> 5 经过一次旋转之后变成了: 5 -> 1 -> 2 -> 3 -> 4 2. 实现思路 旋转链表的实现思路…

    数据结构 2023年5月17日
    00
  • 四边形不等式学习笔记

    简要题意 四边形不等式是一种 dp 优化策略。多用于 2D DP。 内容 对于区间 \([l,r]\) 带来的贡献 \(w(l,r)\),如果其满足: 对于 \(L\leq l\leq r \leq R\),\(w(L,r)+w(l,R)\leq w(L,R)+w(l,r)\) 则称 \(w\) 满足四边形不等式。特别地,如果上式符号取等,则称其满足四边形恒…

    算法与数据结构 2023年4月17日
    00
  • Java数据结构之队列(动力节点Java学院整理)

    Java数据结构之队列(动力节点Java学院整理) 队列是一种有序列表,在其中所有插入操作必须在后端进行,而所有的删除操作必须在前端进行的数据结构。这种结构有时被称为先进先出(FIFO)。 队列的分类 普通队列:队列和栈一样,都是只能在一端进行插入操作,在另一端进行删除操作的特殊线性表。队列的特点是:先进先出。适用于数据必须按照插入顺序处理的必要场合。 双端…

    数据结构 2023年5月17日
    00
  • C语言数据结构与算法之链表(一)

    欢迎阅读本篇文章,本文将为大家详细讲解C语言中数据结构与算法之链表。接下来,将从以下几个方面为大家讲述: 链表的定义 链表的特点 链表的分类 单向链表的实现及应用 双向链表的实现及应用 示例说明 1. 链表的定义 链表是由一系列节点组合而成的数据结构,每个节点都包含了一个数据域和一个指向下一个节点的指针域。其中,链表的头结点为第一个节点,而尾节点为最后一个节…

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

    Go语言数据结构之选择排序示例详解 什么是选择排序? 选择排序是一种简单的排序算法,它的基本思想是在待排序的数列中选择一个最小(或最大)的元素放到最前面,再在剩下的数列中选择一个最小(或最大)的元素放到已排序序列的末尾,以此类推,直到所有的元素都排序完毕。 其排序的时间复杂度为O(N²),在数据量较小的情况下使用起来非常方便。 选择排序的实现 下面我们来看一…

    数据结构 2023年5月17日
    00
  • 手写 Vue3 响应式系统(核心就一个数据结构)

    下面是手写 Vue3 响应式系统的完整攻略。 1. 概述 Vue3 的响应式系统使用了 Proxy 对象来监测对象的变化,相较于 Vue2 的响应式系统使用 Object.defineProperty 进行数据劫持,Proxy 具有更好的性能和更简洁的 API。 当我们修改 Vue3 中的 reactive 对象内部的数据时,就会触发依赖收集和派发更新的操作…

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

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

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