C语言静态链表的实现

在静态链表中,元素之间按照顺序存储在数组中,数组中的每个元素都包含两个部分:数据部分和游标部分。数据部分用于存储元素的值,游标部分用于指示下一个元素的索引位置。这种结构使得在插入和删除操作时,只需要修改游标,而不需要像链表那样移动整个元素。

对于静态链表的基本操作,包括插入、删除和查找等,具体实现逻辑如下:

  1. 插入操作:首先需要确定插入的位置,然后修改游标以反映新的元素顺序。如果插入的位置在数组的末尾,那么直接修改游标即可;如果插入的位置在数组的中间或开头,则需要按照一定的规则修改游标。
  2. 删除操作:首先需要确定删除元素的索引位置,然后修改游标以反映删除后的元素顺序。如果删除的是数组的最后一个元素,那么直接修改游标即可;如果删除的是数组的中间或开头元素,则需要按照一定的规则修改游标。
  3. 查找操作:在静态链表中查找元素,需要从头元素开始遍历数组,逐个比较元素的值,直到找到目标元素或遍历完整个数组。
cpp 复制代码
#include <stdio.h>
#include <stdlib.h>

#define MAX_SIZE 100

typedef struct {
    int data;
    int next;
} StaticNode;

typedef struct {
    StaticNode nodes[MAX_SIZE];
    int free[MAX_SIZE];
    int size;
    int freeSize;
} StaticList;

// 初始化静态链表
void initList(StaticList* list) {
    list->size = 0;
    list->freeSize = MAX_SIZE;
    for (int i = 0; i < MAX_SIZE - 1; i++) {
        list->free[i] = i + 1;
    }
    list->free[MAX_SIZE - 1] = -1; // 最后一个元素的next设为-1,表示链表结束
}

// 从空闲链表中获取一个节点
int mallocList(StaticList* list) {
    if (list->freeSize > 0) {
        int index = list->free[0];
        list->freeSize--;
        for (int i = 0; i < list->freeSize; i++) {
            list->free[i] = list->free[i + 1];
        }
        return index;
    }
    return -1; // 空闲链表为空,返回-1
}

// 将节点归还给空闲链表
void freeList(StaticList* list, int index) {
    list->free[list->freeSize] = index;
    list->freeSize++;
}

// 在静态链表末尾添加节点
void appendNode(StaticList* list, int data) {
    int index = mallocList(list);
    if (index != -1) {
        list->nodes[index].data = data;
        list->nodes[index].next = -1; // 新添加的节点next设为-1,表示链表结束
        if (list->size == 0) {
            list->nodes[0].next = index; // 如果是第一个节点,头节点指向它
        } else {
            int temp = 0; // 头节点是哑节点,不存数据
            while (list->nodes[temp].next != -1) {
                temp = list->nodes[temp].next;
            }
            list->nodes[temp].next = index; // 找到尾节点,添加新节点
        }
        list->size++;
    } else {
        printf("静态链表已满,无法添加新节点\n");
    }
}

// 打印静态链表
void printList(StaticList* list) {
    int temp = list->nodes[0].next; // 从头节点的下一个节点开始打印
    while (temp != -1) {
        printf("%d ", list->nodes[temp].data);
        temp = list->nodes[temp].next;
    }
    printf("\n");
}

int main() {
    StaticList list;
    initList(&list);
    
    appendNode(&list, 1);
    appendNode(&list, 2);
    appendNode(&list, 3);
    
    printList(&list);
    
    return 0;
}
相关推荐
2301_7644413320 小时前
用动力学系统(微分方程)为 Kernberg 的客体关系单元提供数学化的操作定义,把“自体—客体“这对心理结构建模成一个二维耦合系统
数据结构·python·算法·数学建模
三十岁老牛再出发21 小时前
07.26每日总结
linux·c语言·mysql
code_pgf1 天前
C/C++ 常用容器功能汇总
c语言·开发语言·c++
个 人 练 习 生1 天前
strcmp与strstr函数的模拟实现
c语言·开发语言·经验分享·学习·程序人生
小羊先生car1 天前
RTOS-F429-HAL-基础内容认识(2026/7/26)
c语言
Discipline~Hai1 天前
ARM03-蜂鸣器和中断
c语言·arm开发·单片机·嵌入式硬件·嵌入式
冻柠檬飞冰走茶1 天前
PTA基础编程题目集 7-7 12-24小时制(C语言实现)
c语言·开发语言·数据结构·算法
雨落在了我的手上1 天前
Java数据结构(八):双链表的实现
数据结构
runafterhit1 天前
python基础语法命令(C程序员刷leetcode)
c语言·python·leetcode
笨笨饿1 天前
#102_Codex无在VSCold无法打开
java·c语言·数据库·笔记