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

江南北

关注

阅读 15

2024-12-04


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


精彩评论(0)

0 0 举报