建立简单的静态链表
静态链表是线性链表的一种特殊形式,它是用数组来描述的。对于线性链表,我们一般用指针来建立节点间的逻辑关系,但对于静态链表,我们利用游标(cursor)来代替指针指示下一个节点。游标其实就是数组的下标。
静态链表中的节点一般包含两部分信息:数据域和游标。数据域用于存储节点的值,而游标则用于指示下一个节点的位置。静态链表通常用数组来实现,数组的每一个元素就是一个节点。
建立静态链表的基本步骤包括:
分配一个足够大的数组来存储链表节点。
初始化链表的头节点,通常使用一个特殊的游标值来表示链表的结束,如0或-1。
逐个插入数据元素,并更新游标值以建立节点间的逻辑关系。
以下是一个简单的静态链表实现示例,使用C语言编写:
c复制代码
|
#include <stdio.h> |
|
#include <stdlib.h> |
|
|
|
#define MAXSIZE 100 // 定义静态链表的最大长度 |
|
|
|
// 静态链表节点的结构体定义 |
|
typedef struct { |
|
int data; // 数据域 |
|
int cur; // 游标,指向下一个节点在数组中的位置 |
|
} Component, StaticLinkList[MAXSIZE]; |
|
|
|
// 初始化静态链表 |
|
void InitList(StaticLinkList space) { |
|
for (int i = 0; i < MAXSIZE - 1; i++) { |
|
space[i].cur = i + 1; // 初始化游标,指向下一个位置 |
|
} |
|
space[MAXSIZE - 1].cur = 0; // 最后一个节点的游标设置为0,表示链表结束 |
|
} |
|
|
|
// 在静态链表中插入元素 |
|
int ListInsert(StaticLinkList space, int i, int e) { |
|
int j, k, l; |
|
// 查找第i个节点的前驱节点的位置j |
|
j = MAXSIZE - 1; // 从表尾开始向前查找 |
|
for (k = 1; k <= i; k++) { |
|
j = space[j].cur; |
|
if (j == 0) { // 查找失败,即i大于表长+1 |
|
return 0; |
|
} |
|
} |
|
// 找到第i个节点的前驱节点后,将新节点插入到第i个位置 |
|
l = space[0].cur; // 空闲分量的第一个位置 |
|
space[0].cur = space[l].cur; // 将第l个分量作为空闲分量 |
|
space[l].data = e; // 存储元素值 |
|
space[l].cur = space[j].cur; // 插入新节点 |
|
space[j].cur = l; // 修改前驱节点的游标 |
|
return 1; |
|
} |
|
|
|
// 打印静态链表 |
|
void PrintList(StaticLinkList space) { |
|
int i = space[MAXSIZE - 1].cur; // 从链表的头节点开始遍历 |
|
while (i) { |
|
printf("%d ", space[i].data); |
|
i = space[i].cur; |
|
} |
|
printf("\n"); |
|
} |
|
|
|
int main() { |
|
StaticLinkList L; |
|
InitList(L); // 初始化静态链表 |
|
ListInsert(L, 1, 10); // 在第1个位置插入元素10 |
|
ListInsert(L, 2, 20); // 在第2个位置插入元素20 |
|
ListInsert(L, 3, 30); // 在第3个位置插入元素30 |
|
PrintList(L); // 打印链表内容,应为:10 20 30 |
|
return 0; |
|
} |
在上面的代码中,我们首先定义了一个结构体Component来表示静态链表中的节点,然后定义了一个数组StaticLinkList来存储这些节点。InitList函数用于初始化静态链表,将数组中的每个节点的游标初始化为指向下一个节点的位置,最后一个节点的游标设置为0,表示链表结束。ListInsert函数用于在静态链表的指定位置插入元素。PrintList函数则用于打印链表中的所有元素。
请注意,静态链表虽然具有一些数组的特性(如内存空间的连续性),但它仍然保持了链表的动态性,允许我们在运行时插入和删除节点。不过,静态链表也有其局限性,比如需要预先分配较大的数组空间,而且数组的大小一旦确定后通常不能改变。因此,在选择使用静态链表时需要根据具体的应用场景和需求进行权衡。