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

news/2025/1/19 14:28:36/
#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.ppmy.cn/news/1551235.html

相关文章

聊一聊Elasticsearch的索引(2)

1、索引状态的管理 对索引状态的管理操作包括&#xff1a;清空缓存&#xff08;clear cache&#xff09;、刷新索引&#xff08;refresh index&#xff09;、冲洗索引&#xff08;refresh index&#xff09;、强制合并&#xff08;force merge&#xff09;、关闭索引&#xff…

php+Mysql单页支持不同数据结构不同查询条件查搜多表实例

phpMysql单页支持不同数据结构不同查询条件查搜多表实例 本来还要增加删 改 新增的&#xff0c;眼睛需要休息所以放弃后续制作(增删改代码已删或注释) 直接用可以用于自己多表查搜&#xff0c;界面还可以&#xff1b;有兴趣的可以自己二次开发成改删增 <?php function co…

java jvm部分命令 ~~还在完善中

命令整理 jps -q 只输出进程号 -m main 函数的参数 -l 主类全名 -v 输出jvm参数 jstat jstat -gc pid 1000 10 class gc gccapacity gcutil gccause gcnew gcnewcapacity gcold gcoldcapacity compiler printcompilation gcmetacapacity jinfo -sysprops pid -flags pid -flag…

# issue 7 TCP回声服务器和客户端

一、TCP/IP协议栈 为什么需要理解协议栈&#xff1f; 学习C/C就是要懂底层的原理。不然永远是“调包侠” 根据数据传输方式的不同&#xff0c;基于网络协议&#xff08;这里是指基于TCP/IP协议&#xff09;的套接字一般分为TCP 套接字和UDP 套接字。因为TCP 套接字是面向连接的…

【docker集群应用】Docker数据管理与镜像创建

文章目录 Docker数据管理数据卷&#xff08;Data Volumes&#xff09;示例 数据卷容器&#xff08;Data Volume Containers&#xff09;示例 端口映射容器互联 Docker镜像的创建方法基于现有镜像创建1.首先启动一个镜像&#xff0c;在容器里做修改2.然后将修改后的容器提交为新…

linux实时操作系统xenomai看门狗(watchdog)机制及作用介绍

版权声明&#xff1a;本文为本文为博主原创文章&#xff0c;转载请注明出处 https://www.cnblogs.com/wsg1100。如有错误&#xff0c;欢迎指正。 文章目录 一、前言PREEMPT-RT&#xff08;RT Throttling&#xff09; 一、xenomai watchdog介绍二、xenomai watchdog工作原理三、…

Flink四大基石之State

State state 可以理解为-- 历史计算结果 有状态计算和无状态计算 无状态计算: 不需要考虑历史数据, 相同的输入,得到相同的输出!如:map, 将每个单词记为1, 进来一个hello, 得到(hello,1),再进来一个hello,得到的还是(hello,1) 有状态计算: 需要考虑历史数据, 相同的输入,可…

T507 buildroot linux4.9之RTC8563开发调试

文章目录 前言一、硬件确认1.1、RTC8563硬件二、驱动配置2.1、驱动位置2.2、使用config宏配置驱动2.3、DTS配置三、断电重启时间不保存分析四、解决问题五、测试前言 调试T507的RTC8563,解决中调试遇到的问题 一、硬件确认 1.1、RTC8563硬件 通过原理图确认 RTC8563 硬件的…