链表中结点空间的分配和释放由malloc函数和free函数动态实现,故称之为动态链表。
静态链表的定义(区分)
顺序存储结构模拟链表,即将逻辑结构上相邻的数据元素,存储在指定的一块内存空间中。
区别一:数据元素只允许在这块内存空间中随机存放
区别二:每个结点含有两个域,一个是存放结点的数据域,另一个是存放后继结点在结构数组中的相对位置的游标(即数组下标值)
区别三:静态链表需要对数组的第一个和最后一个元素作为特殊元素处理,不存数据。通常把未被使用的数组元素称为备用链表。而数组第一个元素,即下标为0的元素的cursor就存放备用链表的第一个结点的下标;而数组的最后一个元素的cur则存放第一个有数值的元素的下标,相当于单链表中的头结点作用,当整个链表为空时,则为0。
静态链表的存储结构
数据域的类型是char字符串类型,游标域的类型是int类型
typedef char ElemType;
typedef struct
{
ElemType data;
int cursor;
} Component,StaticList[MAXSIZE];
初始化
静态链表的初始化:将静态单链表初始化为一个备用的静态单链表,设s为静态单链表存储空间的首地址,av为备用静态单链表的头指针
//初始化
void primary(StaticList s,int *av)
{
int k;
s[0].cursor=-1;//s[0]相当于头结点
for(k=1;k<MAXSIZE-1;k++)
s[k].cursor=k+1;
s[MAXSIZE-1].cursor=-1;//把链连在一起
*av=1; //设置备用静态单链表的头指针初值
printf("初始化成功!");
}
分配结点空间
对系统而言,分配结点空间相当于在该链表中减少一个结点,对使用者而言则相当于申请了一个可用的新结点
//分配结点空间
int getnode(StaticList s,int *av)
{
int i;
i=*av;
*av=s[*av].cursor;
return i;
}
回收结点空间
对系统而言,回收空闲结点相当于在该链表中增加一个结点,对使用者而言相当于释放了一个不用的结点
//回收结点空间
void freenode(StaticList s,int *av,int k)
{
s[k].cursor=*av;
*av=k;
}