静态链表与动态链表不一样,动态链表使用了malloc和free,还有结构体成员中有next指针。而静态链表使用的是结构体数组,结构体数组包含两部分,数据域(用来存放数据)和节点域(用来存放下个数组的下标),这样就构成了一个静态链表。但静态链表必须自己定义malloc和free。
代码:
#include <stdio.h>
#include <string.h>
#define MAXSIZE 1000
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
/*
space[0].cur用来存放备用链表第一个结点的下标(空数组)
space[MAXSIZE].cur用来存放第一个插入元素的下标,相当于头结点
*/
typedef char ElemType;
typedef int Status;
typedef struct//定义结构体
{
ElemType data;
int cur;
}component,StaticLinkList[MAXSIZE];
Status visit(ElemType c)//输出数组中的内容
{
printf("%c ",c);
return OK;
}
/*返回静态链表的元素个数*/
int ListLength(StaticLinkList L)
{
int j=0;
int i = L[MAXSIZE - 1].data;
while(i)
{
i = L[i].cur;
j++;
}
return j;
}
/*若备用链表非空,则返回分配到的结点下标*/
int Malloc_SSL(StaticLinkList space)
{
int i = space[0].cur;
if(space[0].cur)
{
space[0].cur = space[i].cur;
}
return i;
}
void Free_SSL(StaticLinkList space,int k)
{
space[k].cur = space[0].cur;
space[0].cur = k;
}
/*初始化链表*/
Status InitList(StaticLinkList space)
{
int i;
for ( i = 0;i < MAXSIZE - 1; i++)
{
space[i].cur = i + 1;
}
space[MAXSIZE-1].cur = 0;
return OK;
}
/*静态链表的插入操作*/
Status ListInsert(StaticLinkList L, int i, ElemType e)
{
int j , k, l;
k = MAXSIZE - 1;
if(i < 1 || i > ListLength(L) + 1)
{
return ERROR;
}
j = Malloc_SSL(L);
if(j)
{
L[j].data = e;
for(l = 1;l <= i - 1; l++)
{
k = L[k].cur;
}
L[j].cur = L[k].cur;
L[k].cur = j;
return OK;
}
return ERROR;
}
/*静态链表的删除操作*/
Status ListDelete(StaticLinkList L, int i)
{
int k,j;
if(i<1 || i>ListLength(L))
{
return ERROR;
}
k = MAXSIZE - 1;
for (j = 1; j <= i - 1; j++)
{
k = L[k].cur;
}
j = L[k].cur;
L[k].cur = L[j].cur;
Free_SSL(L,j);
return OK;
}
Status ListTraverse(StaticLinkList L)
{
int j=0;
int i=L[MAXSIZE-1].cur;
while(i)
{
visit(L[i].data);
i=L[i].cur;
j++;
}
return j;
printf("\n");
return OK;
}
int main()
{
StaticLinkList L;
Status i;
i=InitList(L);
printf("初始化L后:L.length=%d\n",ListLength(L));
i=ListInsert(L,1,'F');
i=ListInsert(L,1,'E');
i=ListInsert(L,1,'D');
i=ListInsert(L,1,'B');
i=ListInsert(L,1,'A');
printf("\n在L的表头依次插入FEDBA后:\nL.data=");
ListTraverse(L);
i=ListInsert(L,3,'C');
printf("\n在L的“B”与“D”之间插入“C”后:\nL.data=");
ListTraverse(L);
i=ListDelete(L,1);
printf("\n在L的删除“A”后:\nL.data=");
ListTraverse(L);
printf("\n");
return 0;
}