该代码方法的实现的参数请参考第一个文章
#include <stdio.h>
#define OK 1
#define ERROR 0
#define MAXSIZE 100
typedef int Status;
typedef int ElemType;
//定义静态链表的存储结构
typedef struct
{
ElemType data;
int cursor;
}Component,StaticLinkList[MAXSIZE];
//进行分配空间(其实就是返回头游标)
int StaticMalloc(StaticLinkList list)
{
int index;
index = list[0].cursor;
return index;
}
//释放空间 (其实就是改变头元素的游标指向)
void StaticFree(StaticLinkList list, int index)
{
list[index].cursor = list[0].cursor;
list[0].cursor = index;
}
//获取游标是0的指针下标
int GetZeorForCursor(StaticLinkList list)
{
int index = 0;
int cur;
cur = list[MAXSIZE-1].cursor;
while(cur)
{
index = cur;
cur = list[cur].cursor;
}
return index;
}
//进行初始化
Status InitList(StaticLinkList list)
{
int i;
for(i = 0 ; i < MAXSIZE - 1; i++)
{
list[i].cursor = i+1;
}
list[MAXSIZE-1].cursor = 0;
return OK;
}
//添加元素
Status Add(StaticLinkList list, ElemType elem)
{
int oldZeorCursorIndex; //之前游标为0的元素的下标
int mallocIndex; //头元素的游标
oldZeorCursorIndex = GetZeorForCursor(list);
mallocIndex = StaticMalloc(list);
if(!mallocIndex)
{
return ERROR;
}
list[oldZeorCursorIndex].cursor = mallocIndex;
//更改尾元素的游标所指向的位置
if(list[0].cursor == 1)
{
list[MAXSIZE-1].cursor = 1;
}
list[0].cursor = list[mallocIndex].cursor;
list[mallocIndex].data = elem;
list[mallocIndex].cursor = 0;
return OK;
}
//根据下标获取元素
Status GetElem(StaticLinkList list, ElemType *elem, int index)
{
int cur;
int i = 0;
cur = list[MAXSIZE-1].cursor;
while(cur && i < index)
{
cur = list[cur].cursor;
i++;
}
if(i != index || !cur) return ERROR;
*elem = list[cur].data;
return OK;
}
//插入元素
Status Insert(StaticLinkList list, ElemType elem, int index)
{
int j, k; // j要插入的位置的前面的下标, k新插入元素的下标
int count = 0;
j = MAXSIZE-1;
while(j && count < index)
{
j = list[j].cursor;
count++;
}
k = StaticMalloc(list);
if(count != index || !j || !k) return ERROR;
list[0].cursor = list[k].cursor;
list[k].data = elem;
list[k].cursor = list[j].cursor;
list[j].cursor = k;
return OK;
}
//删除元素
Status Delete(StaticLinkList list, int index)
{
int j, k; //j要删除的位置的前面的下标, k要删除的元素的下标
int count = 0;
j = MAXSIZE-1;
while(j && count < index)
{
j = list[j].cursor;
count++;
}
k = list[j].cursor;
if(!(k) || index != count) return ERROR;
list[j].cursor = list[k].cursor;
StaticFree(list, k);
return OK;
}
//获取长度
int Length(StaticLinkList list)
{
int count = 0;
int cur;
cur = list[MAXSIZE-1].cursor;
while(cur)
{
cur = list[cur].cursor;
count++;
}
return count;
}
int main(void)
{
Status statu;
StaticLinkList list;
statu = InitList(list);
if(statu == OK)
{
printf("%s : %d\n", "InitList", list[MAXSIZE-1].cursor);
statu = Add(list, 21);
if(statu == OK)
{
printf("%s : %d, %d, %d\n", "Add", list[0].cursor, list[1].data, list[MAXSIZE-1].cursor);
ElemType gElem;
Add(list, 22);
Add(list, 23);
statu = GetElem(list, &gElem, 2);
if(statu)
{
printf("%s : %d\n", "GetElem", gElem);
statu = Insert(list, 24, 2);
if(statu == OK)
{
ElemType insertElem;
GetElem(list, &insertElem, 2);
printf("%s : %d\n", "Insert", insertElem);
statu = Delete(list, 2);
if(statu == OK)
{
ElemType delElem;
GetElem(list, &delElem, 2);
printf("%s : %d\n", "Delete", delElem);
//Delete(list, 2);
//Add(list, 31);
int len = Length(list);
printf("%s : %d\n", "Length", len);
}
}
}
}
}
return 0;
}