当前位置: 首页 > article >正文

普通单向有头链表,用于内存资源受限,不带mmu的单片机

#include <stdint.h>
#include <stdbool.h>
#include <stdio.h>

#define NODE_COUNT 10  // 定义节点的总数量

// 链表节点结构
typedef struct Node {
    int data;          // 节点的数据
    struct Node* next; // 指向下一个节点的指针
} Node;

// 全局节点数组和链表头指针
Node nodeArray[NODE_COUNT];
Node* freeListHead = NULL;  // 空闲链表头
Node* dataListHead = NULL;  // 数据链表头

// 初始化链表
void init() {
    // 初始化空闲链表
    for (int i = 0; i < NODE_COUNT; ++i) {
        nodeArray[i].next = (i < NODE_COUNT - 1) ? &nodeArray[i + 1] : NULL;
    }
    freeListHead = &nodeArray[0];
    dataListHead = NULL;
}

// 从空闲链表中获取一个节点
Node* getFreeNode() {
    if (freeListHead == NULL) {
        return NULL; // 空闲链表为空
    }
    Node* node = freeListHead;
    freeListHead = freeListHead->next;
    return node;
}

// 释放一个节点到空闲链表
void releaseNode(Node* node) {
    node->next = freeListHead;
    freeListHead = node;
}

// 向数据链表中插入一个新节点
void insertNode(int data) {
    Node* newNode = getFreeNode();
    if (newNode == NULL) {
        // 没有可用的节点
        printf("No available nodes to insert.\n");
        return;
    }
    newNode->data = data;
    newNode->next = dataListHead;
    dataListHead = newNode;
}

// 从数据链表中删除一个节点
void deleteNode(int data) {
    Node** ptr = &dataListHead;
    while (*ptr != NULL) {
        if ((*ptr)->data == data) {
            Node* nodeToDelete = *ptr;
            *ptr = nodeToDelete->next; // 更新前驱节点的指针
            releaseNode(nodeToDelete);  // 将节点插入到空闲链表中
            return;
        }
        ptr = &(*ptr)->next; // 移动到下一个节点
    }
    printf("Node with data %d not found.\n", data);
}

// 检查数据链表是否为空
bool isDataListEmpty() {
    return dataListHead == NULL;
}

// 打印数据链表
void printDataList() {
    Node* current = dataListHead;
    while (current != NULL) {
        printf("%d -> ", current->data);
        current = current->next;
    }
    printf("NULL\n");
}

int main() {
    init();

    // 插入节点
    insertNode(10);
    insertNode(20);
    insertNode(30);

    // 打印数据链表
    printf("Data List: ");
    printDataList();

    // 删除节点
    deleteNode(20);

    // 打印数据链表
    printf("Data List after deleting node with data 20: ");
    printDataList();

    // 再次插入节点
    insertNode(40);

    // 打印数据链表
    printf("Data List after inserting node with data 40: ");
    printDataList();

    return 0;
}

测试:

root@iZwz99zhkxxl5h6ecbm2xwZ:~/serial-ipc# gcc list.c 
root@iZwz99zhkxxl5h6ecbm2xwZ:~/serial-ipc# ./a.out 
Data List: 30 -> 20 -> 10 -> NULL
Data List after deleting node with data 20: 30 -> 10 -> NULL
Data List after inserting node with data 40: 40 -> 30 -> 10 -> NULL
root@iZwz99zhkxxl5h6ecbm2xwZ:~/serial-ipc#

http://www.kler.cn/a/420383.html

相关文章:

  • 使用 LLaMA-Factory 微调
  • 计算机网络-网络安全
  • Vulnhub靶场 Matrix-Breakout: 2 Morpheus 练习
  • 打造双层环形图:基础与高级渐变效果的应用
  • MyBatis中的WHERE 1 = 1是什么
  • 【合作原创】使用Termux搭建可以使用的生产力环境(一)
  • redis升级
  • 人工智能机器学习算法分类全解析
  • 带Burst AOT Settings移植问题
  • CSS:Web美学的革新之旅
  • 【Java基础入门篇】三、面向对象和JVM底层分析(3)
  • 【设计模式系列】工厂方法模式(二十一)
  • CSS函数
  • 为什么混合精度训练中优化器参数仍然以 FP32 存储?LLaMA 2 7B 模型在混合精度下的显存需求
  • react 父子组件通信
  • 【Qt】QDateTimeEdit控件实现清空(不保留默认时间/最小时间)
  • Pytorch使用手册- TorchVision目标检测微调Tutorial的使用指南(专题十二)
  • bash命令缓存导致命令执行失败的问题
  • 插入数据如何确保redis与数据库同步 详解
  • 单链表---链表分割
  • 基于米尔全志T527开发板的FacenetPytorch人脸识别方案
  • 【C++】深入解析 using namespace std 语句
  • npm error code ETIMEDOUT 简单排查
  • 双向长短期记忆(Bi-LSTM)神经网络介绍
  • Linux - 前端程序员常用的 Linux 命令
  • LearnOpenGL学习(光照 -- 投光物,多光源)