# 静态链表

## 1. 定义

- 单链表：各个结点在内存中星罗棋布、散落天涯。
- 静态链表：分配一整片连续的内存空间，各个结点集中安置。

| 内存地址 | 数据域 | 游标域 |
| -------- | ------ | ------ |
| ...      | ...    | ...    |
| 0        | 头     | 2      |
| 1        | $e_2$  | 6      |
| 2        | $e_1$  | 1      |
| 3        | $e_4$  | -1     |
| 4        | ...    | ...    |
| 5        | ...    | ...    |
| 6        | $e_3$  | 3      |
| 7        | ...    | ...    |
| 8        | ...    | ...    |
| 9        | ...    | ...    |
| ...      | ...    | ...    |

- 游标充当 “指针”。
- 游标为 `-1` 表示已经到达表尾。

每个数据元素 $4B$，每个游标 $4B$（每个结点共 $8B$），设其实地址为 $addr$，则 $e_1$ 的存放地址为：

$$
addr + 8*2
$$

```cpp
#define MaxSize 10
typedef struct
{
    ElemType data;
    int next;
} SNode;
```

高级写法：

```cpp
typedef struct
{
    int data;
    int next;
} SLinkList[MaxSize];
```

```cpp
SLinkList a;
```

```cpp
struct Node
{
    int data;
    int next;
};
typedef struct Node SLinkList[MaxSize];
```

```cpp
struct Node a[MaxSize];
```

## 2. 初始化

```cpp
SLinkList a;
a[0]->next = -1;
for (int i = 1; i < a.length; i++)
{
    a[i].next = -2;
}
```

## 3. 查找

查找某个位序的结点，需要从头结点出发，挨个往后遍历结点。

- 时间复杂度 $O(n)$

区别：

- 位序：各个结点在逻辑上的顺序。
- 数组下标：各个结点在物理上的位置。

## 4. 插入

1. 找到一个空的结点，存入数据元素。
2. 从头结点出发，找到位序为 $i-1$ 的结点。
3. 修改新节点的 `next`。
4. 修改 $i-1$ 结点的 `next`。

## 5. 删除

1. 从头结点出发找到前驱结点。
2. 修改前驱结点的 `next`。
3. 被删除结点的 `next` 设置为 `-2`。
