完全是ctrl c / v的new bing 吐出来的代码,看着还不错,按自己的想法补了点注释。
这是一个使用空闲链表技术优化后的单向链表实现,它使用静态数组作为内存池,而不是堆内存。它还包含一个有序插入函数,可以根据
data
的大小自动找到合适的插入位置,使整个链表保持从小到大的顺序。这个版本添加了一些注释,以帮助您更好地理解代码。请注意,这只是一个示例,您可能需要根据您的具体需求进行修改。
空闲链表:就是把内存池本身初始化成一个链表,每个节点对应一个空闲的块,创建新链表的节点时直接从空闲链表里拿,不用反复查找。几乎不用多付出空间成本,只是在内存池初始化时多费一点时间。
有序插入函数:就是在插入的时候把节点排好序,之后用起来方便。
代码
#include <stdio.h>
#include <stdbool.h>
#define POOL_SIZE 10
typedef struct Node {
int data;
struct Node *next;
} Node;
Node memory_pool[POOL_SIZE]; // 后续可以把内存池和head 节点包在一个结构体里面
Node *free_list = NULL; //空闲链表的头节点
// 初始化内存池
void init_memory_pool() {
for (int i = 0; i < POOL_SIZE; i++) {
memory_pool[i].next = free_list; //从末端节点开始逐步初始化空闲链表
free_list = &memory_pool[i];
}
}
// 从内存池中获取一个空闲节点
Node *get_node_from_pool() {
if (free_list == NULL) {
printf("Memory pool is full\n");
return NULL;
}
Node *node = free_list;
free_list = free_list->next; // 空闲链表的节点存取都发生在头节点
return node;
}
// 将节点返回到内存池中
void return_node_to_pool(Node *node) {
node->next = free_list;
free_list = node;
}
// 在链表头部插入一个新节点
void insert(Node **head, int data) {
Node *new_node = get_node_from_pool();
if (new_node == NULL) return;
new_node->data = data;
new_node->next = *head;
*head = new_node;
}
// 按顺序插入一个新节点
void insert_sorted(Node **head, int data) {
Node *new_node = get_node_from_pool();
if (new_node == NULL) return;
new_node->data = data;
// 查找插入位置
Node *current = *head, *prev = NULL;
while (current != NULL && current->data < data) { //找到一个比新节点大的节点,把新节点插在前面,实现从小到大排序
prev = current;
current = current->next;
}
// 插入新节点
if (prev == NULL) { // 表示head == NULL 或头部第一个节点就比新节点大,所以让head 指向新节点,新节点的next 是原来的head
new_node->next = *head;
*head = new_node;
} else { // prev 指向比新节点大的节点的前一个节点,所以就是要把新节点插进prev 和current 中间
new_node->next = prev->next; // 也可以写成 new_node->next = current;
prev->next = new_node;
}
}
// 删除一个节点
void delete(Node **head, int data) {
Node *temp = *head, *prev;
if (temp != NULL && temp->data == data) {
*head = temp->next;
return_node_to_pool(temp);
return;
}
while (temp != NULL && temp->data != data) {
prev = temp;
temp = temp->next;
}
if (temp == NULL) return;
prev->next = temp->next;
return_node_to_pool(temp);
}
// 打印链表
void print_list(Node *node) {
while (node != NULL) {
printf("%d ", node->data);
node = node->next;
}
}
int main() {
init_memory_pool();
Node *head = NULL;
insert_sorted(&head, 3);
insert_sorted(&head, 1);
insert_sorted(&head, 2);
printf("Created linked list: ");
print_list(head);
delete(&head, 2);
printf("\nLinked list after deletion: ");
print_list(head);
return 0;
}
P.S.
不知道这个版权该怎么算,懒得看巨硬的用户协议,既然我至少付出了复制粘贴 传达神谕的劳动,就算是原创吧 [doge]。