2401_83328824 2024-09-24 15:21 采纳率: 0%
浏览 2

空静态链表该怎么插入?

求,问一下该怎么写啊,有点没看懂,不知道该怎么插入,希望有人能帮忙解答一下

img

  • 写回答

1条回答 默认 最新

  • 嵌入式小企鹅 2024-09-24 16:44
    关注
    
    #include <stdio.h>
    
    #define MAX_SIZE 9
    
    // 定义节点结构体
    typedef struct Node {
        int data;
        int next;
    } Node;
    
    // 定义包含头节点的链表结构体
    typedef struct {
        Node nodes[MAX_SIZE]; // 节点数组
        int avail;            // 空闲节点链表头指针
        int head;             // 链表头指针
    } StaticLinkedList;
    
    // 初始化链表
    void initList(StaticLinkedList* list) {
        for (int i = 0; i < MAX_SIZE - 1; i++) {
            list->nodes[i].next = i + 1;
        }
        list->nodes[MAX_SIZE - 1].next = -1;
        list->avail = 0; // 初始时所有节点都是空闲的
        list->head = -1; // 头指针初始化为-1,表示空链表
    }
    
    // 打印链表
    void printList(StaticLinkedList* list) {
        printf("当前链表状态: \n");
        int current = list->head;
        while (current != -1) {
            printf("%d ", list->nodes[current].data);
            current = list->nodes[current].next;
        }
        printf("\n\n");
    }
    
    // 插入新节点到链表头部
    void insertToHead(StaticLinkedList* list, int value) {
        if (list->avail == -1) {
            printf("没有空闲节点,无法插入。\n");
            return;
        }
        int newNode = list->avail; // 获取一个空闲节点
        list->nodes[newNode].data = value;
        list->avail = list->nodes[newNode].next; // 移动空闲节点指针
        list->nodes[newNode].next = list->head; // 新节点链接到链表头部
        list->head = newNode;
    }
    
    // 删除节点
    void deleteNode(StaticLinkedList* list, int value) {
        int prev = -1;
        int current = list->head;
        while (current != -1 && list->nodes[current].data != value) {
            prev = current;
            current = list->nodes[current].next;
        }
        if (current == -1) {
            printf("未找到值为 %d 的节点。\n", value);
            return;
        }
        if (prev == -1) {
            list->head = list->nodes[current].next; // 删除的是头节点
        } else {
            list->nodes[prev].next = list->nodes[current].next;
        }
        list->nodes[current].next = list->avail; // 将删除的节点加入空闲链表
        list->avail = current;
    }
    
    int main() {
        StaticLinkedList list;
        initList(&list);
    
        // 操作 (1)
        printf("操作 (1): 依次插入 18、56、95、27、44、32\n");
        int insertValues1[] = {18, 56, 95, 27, 44, 32};
        for (int i = 0; i < 6; i++) {
            insertToHead(&list, insertValues1[i]);
        }
        printList(&list);
    
        // 操作 (2)
        printf("操作 (2): 插入 31; 删除 18、44; 插入 87、66; 删除 95\n");
        insertToHead(&list, 31);
        deleteNode(&list, 18);
        deleteNode(&list, 44);
        insertToHead(&list, 87);
        insertToHead(&list, 66);
        deleteNode(&list, 95);
        printList(&list);
    
        return 0;
    }
    
    评论

报告相同问题?

问题事件

  • 创建了问题 9月24日

悬赏问题

  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见
  • ¥15 一共有五道问题关于整数幂的运算还有房间号码 还有网络密码的解答?(语言-python)
  • ¥20 sentry如何捕获上传Android ndk 崩溃
  • ¥15 在做logistic回归模型限制性立方条图时候,不能出完整图的困难
  • ¥15 G0系列单片机HAL库中景园gc9307液晶驱动芯片无法使用硬件SPI+DMA驱动,如何解决?