嵌入式第二十五篇——数据结构单向链表

一、基本概念

单向链表是一种线性数据结构,由一系列节点组成,每个节点包含两部分:数据域(存储数据)和指针域(指向下一个节点的地址)。链表的最后一个节点指向NULL,表示链表结束。与数组不同,链表的内存分配是动态的,插入和删除操作更高效,但随机访问效率较低。

二、特点

(1)动态大小:无需预先分配固定内存,可根据需求动态扩展或收缩。

(2)插入/删除高效:时间复杂度为O(1)(已知位置时),而数组需要移动元素。

(3)内存非连续:节点通过指针链接,物理存储上不要求连续内存空间。

(4)不支持随机访问:必须从头节点开始遍历,访问第n个节点的时间复杂度为O(n)。

三、单向链表的常见操作

1、定义节点结构
c 复制代码
typedef struct Node {
    int data;           // 数据域
    struct Node *next;  // 指针域
} Node;
2、创建链表

初始化一个头节点(或空链表):

c 复制代码
Node* createList() {
    return NULL; // 返回空链表
}
3、插入节点

(1)头部插入:新节点成为头节点。

c 复制代码
Node* insertAtHead(Node *head, int value) {
    Node *newNode = (Node*)malloc(sizeof(Node));
    newNode->data = value;
    newNode->next = head;
    return newNode; // 返回新头节点
}

(2)尾部插入:遍历到链表末尾再插入。

c 复制代码
Node* insertAtTail(Node *head, int value) {
    Node *newNode = (Node*)malloc(sizeof(Node));
    newNode->data = value;
    newNode->next = NULL;

    if (head == NULL) return newNode;

    Node *current = head;
    while (current->next != NULL) {
        current = current->next;
    }
    current->next = newNode;
    return head;
}
4、删除节点

删除指定值的节点

c 复制代码
Node* deleteNode(Node *head, int value) {
    if (head == NULL) return NULL;

    if (head->data == value) {
        Node *temp = head->next;
        free(head);
        return temp;
    }

    Node *current = head;
    while (current->next != NULL && current->next->data != value) {
        current = current->next;
    }
    if (current->next != NULL) {
        Node *temp = current->next;
        current->next = temp->next;
        free(temp);
    }
    return head;
}
5、遍历链表
c 复制代码
void traverseList(Node *head) {
    Node *current = head;
    while (current != NULL) {
        printf("%d -> ", current->data);
        current = current->next;
    }
    printf("NULL\n");
}

四、单向链表的优缺点

  • 优点
    • 插入/删除操作高效。
    • 内存利用率高,无需预分配空间。
  • 缺点
    • 访问元素需遍历,效率低。
    • 指针占用额外内存空间。
相关推荐
数模竞赛Paid answer15 小时前
2025年MathorCup数学建模A题汽车风阻预测解题文档与程序
算法·数学建模·mathorcup
嵌入式小企鹅15 小时前
CPU供需趋紧、DeepSeek V4全链适配、小米开源万亿模型
人工智能·学习·开源·嵌入式·小米·算力·昇腾
宣宣猪的小花园.15 小时前
C语言重难点全解析:内存管理到位运算
c语言·开发语言·单片机
三品吉他手会点灯21 小时前
C语言学习笔记 - 20.C编程预备计算机专业知识 - 变量为什么必须的初始化【重点】
c语言·笔记·学习
sakiko_21 小时前
UIKit学习笔记1-创建项目(使用UIKit)、使用组件
笔记·学习
Old Uncle Tom21 小时前
OpenClaw 记忆系统 -- 记忆预加载
java·数据结构·算法·agent
会编程的土豆21 小时前
洛谷题单入门1 顺序结构
数据结构·算法·golang
生信碱移21 小时前
PACells:这个方法可以鉴定疾病/预后相关的重要细胞亚群,作者提供的代码流程可以学习起来了,甚至兼容转录组与 ATAC 两种数据类型!
人工智能·学习·算法·机器学习·数据挖掘·数据分析·r语言
智者知已应修善业1 天前
【51单片机中的打飞机设计】2023-8-25
c++·经验分享·笔记·算法·51单片机
星幻元宇VR1 天前
VR航空航天科普设备【VR时空直升机】
科技·学习·安全·生活·vr