在静态链表中,元素之间按照顺序存储在数组中,数组中的每个元素都包含两个部分:数据部分和游标部分。数据部分用于存储元素的值,游标部分用于指示下一个元素的索引位置。这种结构使得在插入和删除操作时,只需要修改游标,而不需要像链表那样移动整个元素。
对于静态链表的基本操作,包括插入、删除和查找等,具体实现逻辑如下:
#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;
}
?