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日

相关文章

  • 回溯理论基础及leetcode例题

    学习参考 回溯 与递归相辅相成;回溯是递归的副产品,只要有递归就会有回溯。回溯函数也就是递归函数,指的都是一个函数。 回溯搜索法 纯暴力搜索解决的问题 组合问题:N个数里面按一定规则找出k个数的集合切割问题:一个字符串按一定规则有几种切割方式子集问题:一个N个数的集合里有多少符合条件的子集排列问题:N个数按一定规则全排列,有几种排列方式(与组合差别,排列有元…

    算法与数据结构 2023年4月17日
    00
  • Java 数据结构链表操作实现代码

    下面是关于“Java 数据结构链表操作实现代码”的完整攻略。 1.链表实现原理 链表是一种经典的数据结构,其主要原理是通过指针将一系列节点连接起来。链表中的节点包含两个部分,一个是数据域,用于存放数据;另一个是指针域,用于指向下一个节点的位置。链表的头结点指向链表的第一个节点,最后一个节点的指针指向空。 2.链表的基本操作 链表的基本操作包括创建链表、插入节…

    数据结构 2023年5月17日
    00
  • C++数据结构之堆详解

    C++数据结构之堆详解 什么是堆 堆是一种完全二叉树。 堆分为大根堆和小根堆,大根堆满足每个节点的值都大于等于它的子节点,小根堆满足每个节点的值都小于等于它的子节点。 堆的实现 常见的实现堆的方式有数组和链表两种。 数组 由于二叉堆是完全二叉树,所以可以用数组来实现: 对于一个节点i,它的左子节点的下标是2 * i + 1,右子节点的下标是2 * i + 2…

    数据结构 2023年5月17日
    00
  • 虹科案例 | 虹科Domo商业智能,助力保险公司逃离繁杂数据池!

    金融行业的发展充满着不确定性,一个具备强大承保能力和精算专业知识的资金池,对于身处该领域的公司和个人都是十分必要的。 在全国城市联盟(NLC)的协助下成立的NCL Mutual会员制互助保险公司,为各个地区城市提供了稳定的再保险答案。,然而,面对数字化转型这场已经打响的战斗,NCL Mutual却因缺乏中心商业智能系统,在利用数据处理索赔和承保的能力受到了极…

    算法与数据结构 2023年4月17日
    00
  • 滑动窗口总结

    前言 滑动窗口是双指针的一种特例,可以称为左右指针,在任意时刻,只有一个指针运动,而另一个保持静止。滑动窗口路一般用于解决特定的序列中符合条件的连续的子序列的问题。 好处:时间复杂度 O(n^2) —> O(n) 一、算法应用场景 关键词: 1.满足XXX条件(计算结果、出现次数、同时包含) 2.最长/最短/或最值 3.子串/子数组/子序列 最最最…

    算法与数据结构 2023年4月17日
    00
  • TypeScript 基础数据结构哈希表 HashTable教程

    TypeScript 基础数据结构哈希表 HashTable 教程 什么是哈希表 HashTable 在计算机科学中,哈希表(HashTable),也叫散列表,是根据关键码值(Key­value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫作哈希函数,存放记录的数组叫作哈希表。 如何实现哈…

    数据结构 2023年5月17日
    00
  • 代码随想录–二叉树

    二叉树 二叉树–二叉树的递归遍历 题目: 144.二叉树的前序遍历(opens new window) 145.二叉树的后序遍历(opens new window) 94.二叉树的中序遍历 题解: 前序遍历 class Solution { public List<Integer> preorderTraversal(TreeNode root…

    算法与数据结构 2023年4月18日
    00
  • Redis的六种底层数据结构(小结)

    Redis的六种底层数据结构(小结) 简介 Redis是一种基于内存的高效键值存储数据库,它支持六种不同的数据结构来存储数据。这些结构旨在提供高速、灵活和功能强大的一系列功能。在学习Redis时,了解这些数据结构可以帮助您更好地使用Redis并更好地解决您的问题。 Redis的六种底层数据结构 Redis支持以下六种不同的数据结构: String (字符串)…

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