静态链表
一明确概念:
1通常把未使用的数组元素(即未存放数据的节点)称为备用链表,如下标为5,6的节点。
2/*线性表的静态链表存储结构*/
#defineMAXSIZE 1000
typedefstruct
{
ElemTypedata; // 数据
intcur; // 游标(Cursor)
}StaticLinkList[MAXSIZE];
二 核心在于四点(红色部分)
1 我们对数组的第一个和最后一个元素做特殊处理,它们的data不存放数据。
(1)数组的第一个元素(即下标为0的那个元素)的cur存放备用链表的第一个结点的下标。
(2)数组的最后一个元素(即下标为MAXSIZE-1的元素)的cur存放第一个有数据的元素的下标(相当于单链表中的头结点作用)。
(3) /*对静态链表进行初始化相当于初始化数组*/
Status InitList(StaticLinkList space)
{
int i;
for( i=0; i <MAXSIZE-1; i++ )
space[i].cur = i +1;
//数组的第一个元素(即下标为0的元素)的cur存放备用链表的第一个结点的下标。
space[MAXSIZE-1].cur =0;
//数组的最后一个元素(即下标为MAXSIZE-1的元素)的cur存放第一个有数据的元素的下标。
return OK;
}
2 插入操作(核心在于两点)
例如想要把B插在A的后面
(1)第一步需要修改A的游标,使A的游标指向B(即把B的下标赋值给A的游标)。
(2)第二步需要修改B的游标,使B的游标指向C(即把C的下标赋值给B的游标)。
(3)/*获得备用链表的第一个结点的下标(即下标5)*/
intMalloc_SLL(StaticLinkList space)
{
int i =space[0].cur;
// space[0].cur存放备用链表的第一个结点的下标。
if( space[0].cur)
space[0].cur =space[i].cur;
// 获得备用链表的第一个结点的下标之后,这个节点将会被使用,故它的后一个节点(即下标为6的节点)将成为备用链表的第一个结点。
return i;
}
(4)/* 在静态链表L中第i个元素之前插入新的数据元素e(即在C前插入B) */
StatusListInsert( StaticLinkList L, int i, ElemType e )
{
int j, k, l;
k = MAX_SIZE - 1; // 数组的最后一个元素
if( i<1 || i>ListLength(L)+1 )
{
return ERROR;
}
j = Malloc_SLL(L);
//获得备用链表的第一个结点的下标(即下标为5,即将存放B的元素)
if( j )
{
L[j].data = e;
for( l=1; l <= i-1; l++ )
{
k = L[k].cur; //得到A的下标
}
L[j].cur = L[k].cur; //L[k].cur是A的游标,也是C的下标
//把A的游标赋值给B的游标等同于把C的下标赋值给B的游标(即B指向C)
L[k].cur = j;
//把B的下标赋值给A的游标(即A指向B)
return OK;
}
return ERROR;
}