静态链表
定义
- 单链表:各个结点散落在内存中的各个角落,每个结点有指向下一个节点的指针(下一个结点在内存中的地址);
- 静态链表:用数组的方式来描述线性表的链式存储结构: 分配一整片连续的内存空间,各个结点集中安置,包括了——数据元素and下一个结点的数组下标(游标)
- 其中数组下标为0的结点充当"头结点"
- 游标为-1表示已经到达表尾
- 若每个数据元素为4B,每个游标为4B,则每个结点共8B;假设起始地址为addr,则数据下标为2的存放地址为:addr+8*2
- 注意: 数组下标——物理顺序,位序——逻辑顺序;
- 优点:增、删操作不需要大量移动元素;
- 缺点:不能随机存取,只能从头结点开始依次往后查找,容量固定不变
#include<stdio.h>
#include<stdlib.h>#define MaxSize 10struct Node { //静态链表结构类型的定义int data; //存储数据元素int next; //下一个元素的数组下表(游标)
};//用数组定义多个连续存储的结点
void textSLinkList()
{struct Node a[MaxSize]; //数组a作为静态链表,每一个数据元素的类型都是struct Node//.....
}
同:
#define MaxSize 10 //静态链表的最大长度typedef struct{ //静态链表结构类型的定义ELemType data; //存储数据元素int next; //下一个元素的数组下标
}SLinkList[MaxSize];void testSLinkList(){SLinkList a;
}
#define MaxSize 10 //静态链表的最大长度struct Node{ //静态链表结构类型的定义ElemType data; //存储数据元素int next; //下一个元素的数组下标(游标)
};typedef struct Node SLinkList[MaxSize]; //重命名struct Node,用SLinkList定义“一个长度为MaxSize的Node型数组;
注意:SLinkList a 强调a是静态链表;struct Node a 强调a是一个Node型数组;
静态链表的基本操作实现
- 初始化静态链表:把a[0]的next设为-1
- 查找某个位序(不是数组下标,位序是各个结点在逻辑上的顺序)的结点:从头结点出发挨个往后遍历结点,时间复杂度O=(n)
- 在位序为i上插入结点:① 找到一个空的结点,存入数据元素;② 从头结点出发找到位序为i-1的结点;③修改新结点的next;④ 修改i-1号结点的next;
- 删除某个结点:① 从头结点出发找到前驱结点;② 修改前驱节点的游标;③ 被删除节点next设为-2;