#include "stdio.h"
#include "stdlib.h"
#define ERROR 0
#define OK 1
#define FALSE 0
#define TRUE 1
#define MAXSIZE 1000
typedef int ElemType ;
typedef int Status ;
/创建一个静态链表/
typedef struct
{
ElemType data;
int cur;
}Component,StaticLinkList[MAXSIZE];
//数组的第一个元素和最后一个元素作为特殊元素处理,不存数据
//未被使用的数组元素称为备用链表,数组的第一个元素(下标为0的元素)存放第一个备用链表的下标。
//而数组最后一个元素的cur则存放第一个有数值元素的下标,相当于单链表的头结点
/初始化一个静态链表***/
Status InitStaticLinkList(StaticLinkList space)
{
int i;
for(i=0;i1;i++)
{
space[i].cur = i+1;
}
space[MAXSIZE-1].cur = 0;
return OK ;
}
/若备用空间的链表非空,则返回分配的结点下标给e,否则返回0*****/
Status Malloc(StaticLinkList L,int *e)
{
int i;
i = L[0].cur;//将第一个备用链表的地址赋值给i
if(L[0].cur)
{
L[0].cur = L[i].cur;
}
*e = i;
return OK ;
}
/返回静态链表L的长度*/
Status LengthList(StaticLinkList L)
{
int j = 0;
int i = L[MAXSIZE - 1].cur ;
while (i)
{
i = L[i].cur;
j++;
}
return j;
}
/在静态链表L中的第i个位置插入元素e****/
Status InsertLinkList(StaticLinkList L,int i,ElemType e)
{
int k,j,ee,ii;
k = MAXSIZE -1;
if(i<1||i>LengthList(L)+1)
{
return ERROR;
}
Malloc(L,&ee);//获取空闲分量的下标
j=ee;
if(j)
{
L[j].data = e;
for(ii=1;ii<=i-1;++ii)//找到第i个元素之前的位置
{
k = L[k].cur;
}
L[j].cur = L[k].cur;
L[k].cur = j;
return ERROR;
}
}
/释放内存函数/
Status Free(StaticLinkList L,int i)
{
L[i].cur = L[0].cur;
L[0].cur = i;
}
/把静态链表L的第i个位置的元素删掉,并返回给e*******/
Status DeleteLinkList(StaticLinkList L,int i,ElemType *e)
{
int k = MAXSIZE -1;
int j;
if(i<1||i>LengthList(L))//待删除元素的下标范围是否正确
{
return ERROR;
}
for(j = 1;j<=i-1;++j)
{
k = L[k].cur;
}
*e = L[i].data ;
j = L[k].cur ;
L[k].cur = L[j].cur;
Free(L,j);
return OK;
}
/主函数/
int main()
{
StaticLinkList L;
int length=0;
ElemType e;
InitStaticLinkList(L);
InsertLinkList(L,1,3);
printf("静态链表的第1个元素的数据域存放的是:%d\n",L[1].data);
length = LengthList(L);
printf("静态链表L内一共有 %d 个元素\n",length );
DeleteLinkList(L,1,&e);
printf("静态链表中的%d被删除\n",e);
system("pause");
return 0;
}