数据结构之线性表-静态链表及其初始化-学习笔记-18

引入

我们学习了线性表中的顺序存储结构、单链表以及他们的初始化、插入、查找、删除等操作,今天我们来看看,没有动态创建内存空间之前,人们是如何使用链表的~

静态链表

简单来说,我们将用数组描述的链表称为静态链表,这种描述方法叫做游标实现法。
我们知道,链表是由指针域数据域两个部分组成,静态链表也差不多,但它们是由数据域游标组成。因为是数组,所以描述时还有一个下标

  • 数据域:存放的是该静态链表中每个结点的数据。
  • 游标:用于找到下一个结点,类似于指针
    下标:
  • 0号下标存没有数据,游标存储着可以存放数据的下标。
  • max 号下标存储着该静态链表第一个结点的位置,类似于 head 指向头结点。
  • 其他下标存储的是当前结点数据下一个结点的下标

其实简单来说,因为不能动态创建内存空间,那就再顺序存储结构中设置了一个游标,游标类似于指针,存放的不是内存地址,而是下一个结点的下标。

注意
下标:指的是存放这个结构体的数组的下标。
游标:指的是数组每个元素中结构体的一个元素。
总而言之,这就是一个结构体数组

所以,其实就是一个数组

  • 比如其中有10个元素
  • 每个元素都是一个结构体
  • 结构体里面有游标和数据
  • 第一个和最后一个有特别的用处
  • 第一个数据为空,游标为下一个可以插入的数组下标
  • 最后一个数据也为空,游标为数组中第一个存放数据的数组下标

初始化静态链表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <stdio.h>
#include <stdlib.h>
#define Maxsize 10
typedef struct {
int num;
char name[20];
int cur;
}Student[Maxsize];


void create(Student space){
for(int i=0;i<Maxsize-1;i++){
//从第一个数组元素遍历到导出第二个,因为最后一个为0
space[i].cur=i+1; //前一个指向后一个
space[Maxsize-1].cur=0; //最后一位指向0
}
}


int main(){
Student stu;
create(stu);
for (int i=0; i<Maxsize; i++) {
printf("%d\n",stu[i].cur);
}
}

输出结构
1
2
3
4
5
6
7
8
9
0

其实主要就是在数组的赋值上,因为没有 data,所以

  • 除了最后一个,其他都是游标指向下一个数组元素下标
  • 最后一个游标为 0 ,因为没有哪个有 data
  • 记得数组使从 0 开始的,所以不要忘记 Maxsize-1

注意

从上面的例子我们不难看出,其实对数组元素的要求还是蛮多的

  • 我们把数组的第一个和最后一个元素做特殊处理,data 区域不存放数据。
  • 我们把未使用的数组元素称为备用链表。
  • 数组的第一个元素,就是数组下标为 0 的那个元素的 cur 存放的就是备用链表的第一个结点的数组下标。
  • 数组的最后一个元素,也就是 Maxsize-1 这个下标存放的是数组第一个有 data 的数值的元素的下标,可以理解为单链表的 head。
  • 特别注意链表中最后一个结点得游标,指向的是0下标;

尾巴

这是我的个人学习笔记,主要是应付考研复习使用,充斥着一些吐槽和个人观点,并不严谨,欢迎大家参考、指正。


-------------The End-------------
欢迎请我喝咖啡哦~!