mirror of
https://github.com/happyflyer/wangdao-data-structure.git
synced 2026-05-01 22:21:28 +08:00
102 lines
1.8 KiB
Markdown
102 lines
1.8 KiB
Markdown
# 静态链表
|
|
|
|
## 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`。
|