静态链表便于在不设指针类型的高级语言使用链表结构,静态链表用数组描述,数组的一个分量表示一个结点,同时用游标(指示器cur)代替指针来表示结点在数组中的相对位置。
另外我们对数组第一个和最后一个元素作为特殊元素处理,不存数据。数组的第一个元素,即下标为0的元素的cur存放备用链表的第一个结点的下标,而数组 最后一个cur则存放第一个有效数值的下标,相当于单链表中有结点的作用。
/*
2016年10月11日10:47:23
静态链表
*/
#include<stdio.h>
#define MAXSIZE 100
typedef struct
{
int data; //数据域
int cur; //游标,为0是表示无指向
}component, SLinkList[MAXSIZE];
//函数声明
void InitSpace_SL(SLinkList space);
int Malloc_SL(SLinkList space);
void Free_SL(SLinkList space, int k);
void ListTraverse_SL(SLinkList space);
int Listlength_SL(SLinkList space);
bool ListInsert_SL(SLinkList space, int pos, int val);
bool ListDelete_SL(SLinkList space, int pos, int *val);
int main(void)
{
int val;
SLinkList space;
InitSpace_SL(space);
/* ListInsert_SL(space, 1, 99);
ListInsert_SL(space, 2, 100);
ListInsert_SL(space, 3, 101);
ListInsert_SL(space, 4, 102); */
ListTraverse_SL(space);
ListDelete_SL(space, 2, &val);
ListTraverse_SL(space);
return 0;
}
void InitSpace_SL(SLinkList space) //不需要用指针,因为通过改变函数形参数组的值会使实参数组的值改变
{
int i;
int len; //用来存储结点的个数
int val; //用来存储结点的数值
for(i = 0; i < MAXSIZE-1; ++i)
{
space[i].cur = i+1;
}
space[MAXSIZE-1].cur = 0; //目前静态链表为空,最后一个元素cur为0
printf("请输入静态链表结点的个数:\n");
printf("len = ");
scanf("%d",&len);
for(i = 1; i <= len; ++i)
{
printf("请输入第%d个结点的值:",i);
scanf("%d",&val);
space[i].data = val;
}
space[0].cur = len + 1; //第一个数组元素的cur用来存放备用链表的第一个结点下标
space[len].cur = 0;
space[MAXSIZE-1].cur = 1; //最后一个数组元素存放第一个有效结点的下标
return;
}
int Malloc_SL(SLinkList space) //若备用空间链表非空,则返回分配的结点下标,否则返回0
{
int i;
i = space[0].cur; //因为数组第一个结点存放的就是第一个备用链表的下标
if(0 != space[0].cur)
{
space[0].cur = space[i].cur; //更新为备用链表的下一个结点
}
return i;
}
void Free_SL(SLinkList space, int k) //将下标为k的空闲结点回收到备用链表
{
space[k].cur = space[0].cur; //使第k个结点指向原本备用链表的首结点
space[0].cur = k; //将第k个结点作为新的备用链表首结点
return;
}
void ListTraverse_SL(SLinkList space) //遍历输出
{
int i = space[MAXSIZE-1].cur;
while( 0 != i)
{
printf("%d\n", space[i].data);
i = space[i].cur;
}
return;
}
int LocateElem_SL(SLinkList space, int e) //在静态链表L中查找第一个值为e的元素,若找到则返回它在L中的位序,否则返回0
{
int i = space[MAXSIZE-1].cur;
while( (e != space[i].data) && (0 != i) )
{
i = space[i].cur;
}
return i;
}
int Listlength_SL(SLinkList space) //返回静态链表space中有效数值的个数
{
int len = 0;
int i = space[MAXSIZE-1].cur;
while(i)
{
len++;
i = space[i].cur;
}
return len;
}
bool ListInsert_SL(SLinkList space, int pos, int val) //在静态链表L中第pos个位置插入新的元素val,pos从1开始
{
int i,j,k;
if((pos < 1) || (pos > Listlength_SL(space)+1)) //不考虑满的情况
return false;
i = Malloc_SL(space); //或得空闲元素的下标
j = MAXSIZE-1;
if( 0 != i)
{
space[i].data = val;
for(k = 0; k < pos-1; ++k)
{
j = space[j].cur; //找到第pos个元素之前的位置
}
space[i].cur = space[j].cur;
space[j].cur = i;
return true;
}
return false;
}
bool ListDelete_SL(SLinkList space, int pos, int *val) //删除静态链表L中第pos个元素,并用val返回,pos从1开始
{
int i, j, k;
if((pos < 1) || (pos > Listlength_SL(space)))
return false;
k = MAXSIZE-1;
for(i = 0; i < pos-1; ++i)
{
k = space[k].cur; //找到第pos个元素之前的位置
}
j = space[k].cur; //待删除的元素
*val = space[j].data;
space[k].cur = space[j].cur;
Free_SL(space, j);
return true;
}

浙公网安备 33010602011771号