普通单向有头链表,用于内存资源受限,不带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#