学习了数据结构后,最初认识的是顺序表和单链表,那么什么是静态链表呢?机智的避开了顺序表和单链表的缺点,静态链表就此诞生了。用顺序表来模拟单链表,它在插入,删除数据时不用移动数据,而且可以用一维数组来进行描述,这就有效的屏蔽了单链表存储内存分片的问题。
如上图所示为静态链表的示意图,其中静态链表包括有效链(数据域中存储的有有效数据)和空闲链(地址内没有有效数据)两个带头结点的链表。0下标是有效链的头结点,1下标是空闲链的头结点。
需要注意的是:静态链表的next域中保存的是下一个结点的下标。
所以在定义结点时需按如下格式写:
typedef struct SNode
{
char name[10];//定义了十个格子的数组
int next;//后继指针,保存下一个结点的下标。next 的类型必须是int.
}SNode,*SList;
下面就来展现单链表所具有的独特魅力,插入数据。首先需要将空闲链中除了头结点外的第一个结点剔除,给其赋值后插入头插到有效链中。如此便可实现时间复杂度为o(1)的大作。
bool Insert_begin(SList plist,int val)
{
if(IsFull(plist))//判满
{
return false;
}
int p=plist[1].next;//找到空闲结点
plist[1].next=plist[p].next;//将结点从空闲链中剔除
plist[p].data=val;//将数据放到p中
//将p插入到有效链中
plist[p].next=plist[0].next;
plist[0].next=p;
return true;
}