- 静态链表为结构体数组构成
#define EXCEPTION 50
typedef struct StaticList
{
int val;
int cur;
}StaticLinklist[EXCEPTION];
- 创建一个空静态链表
其中,NUM[0].cur指向的是还未存放数据的下一个空闲域.
NUM[MAXSIZE-1].cur中存放头结点
而最后一个非空结点的cur为0,像链表中的NULL.
void StaticList_Init(StaticList* L)
{
int i;
for(i=0;i<MAXSIZE-1;i++)
{
NUM[i].cur = i+1;//使链表的顺序存储空间中,cur依次指向下一空间.
}
NUM[EXCEPTION-1] = 0;
}
void main()
{
StaticListlist NUM;//创建了一个NUM[100]的数组
StaticList_Init(NUM);
}
//NUM[x]中val存放数据,cur充当指针指向下一个域
链表的初始化.
------取自大话数据结构
- 链表的插入
静态链表并非就整整齐齐的排放,其实他可以很乱,就像这样
==实际上通过NUM[999]处的cur充当头结点来对链表进行遍历
int malloc_StaticList(StaticList *L)//获取空闲域
{
int i;
i=L[0].cur;
L[0].cur = L[i].cur; //即将用到空闲结点,将NUM[0].cur指向该空闲结点的下一个空闲结点
return i;
}
void Insert_StaticList(StaticList *L,int n,int e)//n为第几个元素前插入,e为插入的数据
{
int j,k,l;
k = MAXSIZE-1;
l = malloc_StaticList(L);
for(j=0;j<n;j++)//该代码抽出来单独理解
{
k = L[k].cur;
}
L[l].val = e;
L[l].cur = L[k].cur;
L[k].cur = l;
}
//单独解释
for(j=0;j<n;j++)
{
k = L[k].cur;
}
//实质上是通过头结点遍历静态链表
如前面的图999->1->2->7->3…
==链表的删除
1.找到删除的结点的上一结点,记做 S
2.S的下一结点为要删除的结点,将S的cur赋值为下一结点的cur;
3.删除下一结点的数据
void free_List(StaticList *L,int i)//L[0]指向被释放的结点,该结点又指向原先L指向的空闲结点.
{
L[i].cur = L[0].cur;
L[0].cur = i;
}
void Delete_StaticList(StaticList* L,int i)//i为需要删除的第几个数据域
{
int j, k;
k = MAXSIZE-1;
for (j = 1; j < i; j++)//k为删除结点的上一数据域
{
k = L[k].cur;
}
j = L[k].cur;
L[k].cur = L[j].cur;
free_List(L, j);
}