静态链表
用数组描述(游标实现)的链表叫静态链表
游标 | 5 | 2 | 3 | 4 | 0 | 6 | 7 | … | 1 |
---|---|---|---|---|---|---|---|---|---|
数据 | A | C | D | E | … | ||||
下标 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | … | 999 |
从图中可以简单看出
- 数组第一个元素和最后一个元素不存放数据,并且把未使用的数组元素作为备用链表。
- 链表最后一个元素游标为0。
- 数组第一个元素游标存放的是备用链表里面第一个元素数组的下标
- 数组最后一个元素游标存放的是第一个有数值元素的下标,与单链表中头结点的作用相似
线性表的静态链表存储结构
#define MAXSIZE 1000
typedef int ElemType;
typedef struct
{
ElemType data; //存放数据
int cur; //游标(cursor)
}Componment,StaticLinkList[MAXSIZE];
静态链表的初始化
typedef int status; //函数状态
status InitList(StaticLinkList space)
{
int i;
for(i = 0 ; i < MAXSIZE - 1 ; i++);
{
space[i].cur = i + 1;
}
space[MAXSIZE-1].cur = 0;
return OK;
}
静态链表的插入
静态链表的插入,就是在备用链表第一个数组元素里面存放数据,然后将其游标指向想插入位置的元素,再将前一个位置的元素游标指向插入元素的下标,最后将第一个数组元素的游标加1
(所谓游标指向数组元素,就是相应的游标对应整个数组元素的下标)
/*插入分为两部分,获取下标和插入元素*/
/*获取下标,就是获得空闲分量的下标,即第一个数组元素的游标*/
int Malloc_SLL(StaticLinkList space) //数组没有副本机制
{
if(space[0].cur == MAXSIZE - 1) //静态链表满
{
return 0;
}
int i = space[0].cur;
if(space[0].cur)
{
space[0].cur=space[i].cur;
}
return i;
}
/*插入元素,就是修改刚才空闲分量的游标指向插入位置,然后修改插入位置的前一位置游标指向插入元素下标*/
status ListInsert(staticLinkList L,int i, ElemType e)
{
if(i<1 || i>ListLength(L)+1)
{
return 0;
}
int j=Malloc_SLL(L);
if(j)
{
int l=MAXSIZE-1;
L[l].data=e;
for(int k=1;k<=i-1;k++)
{
l = L[l].cur;
}
L[j].cur=L[l].cur;
L[l].cur=j;
return 1;
}
return 0;
}
静态链表的删除
静态链表的删除,简单说来就是将静态链表中要删除位置的前一位置元素游标指向要删除位置的下一元素的下标,最后将数组第一个元素游标指向删除元素的下标,将删除元素的下标指向原来空闲位置的下标
/*删除也分两部分,第一部分将静态链表中要删除位置的前一位置元素游标指向要删除位置的下一元素的下标;
第二部分将数组第一个元素游标指向删除元素的下标,将删除元素的下标指向原来空闲位置的下标*/
/*删除元素*/
status LisDelete(StaticLinkList L,int i)
{
if(i < 1 || i > ListLength(L)
{
return 0;
}
int j=MAXSIZE-1;
for(int k=1;k<=i-1;k++)
{
j=L[j].cur;
}
int l=L[j].cur;
L[j].cur=L[l].cur;
Free_SLL(L,l);
return 1;
}
/*释放位置*/
void(StaticLinkList space,int i)
{
space[k].cur=space[0].cur;
space[0].cur=k;
}
/*获取表长*/
int ListLength(StaticLinkList L)
{
int j=0;
int i=MAXSIZE-1;
while(i)
{
i=L[j].cur;
j++; //计数
}
return j;
}
静态链表的特点
- 优点
- 插入删除只需要修改游标不需要移动元素,改进了在循序存储结构中插入和删除操作需要移动大量元素的特点
- 缺点
- 没有解决连续存储分配(数组)带来的表长难以确定的问题;简单说就是分大了浪费,分小了不够。
- 失去了顺序存储结构中随机存取的特性