#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#