1 节约频繁的分配/删除内存的时间
2 在内存分配和使用上更安全(避免溢出和分配失败)
3 限制内存在一块连续内存里随机分配,减少因动态分配内存而产生的外部碎片
#include <stdio.h>
#define SIZE 1000
#define ERROR 0
#define OK 1
typedef int Status;
typedef char ElemType;
typedef struct
{
ElemType data;
int next;
}Component,SLL[SIZE];
Status initList(SLL L)
{
int i;
for (i=0; i<SIZE; ++i)
L[i].next = i+1;
L[SIZE-2].next = 0;
L[SIZE-1].next = 0;
return 1;
}
int listLength(SLL L)
{
int i = SIZE-1,j;
for (j=0; L[i].next; ++j)
{
i = L[i].next;
}
return j;
}
int MALLOC_SLL(SLL L)
{
int i = L[0].next;
if(i)
L[0].next = L[i].next;
return i;/*返回取得的最近的空闲游标值*/
}
void FREE_SLL(SLL L, int i)
{
L[i].next = L[0].next;
L[0].next = i;
}
Status insertElem(SLL L, int i, ElemType e)
{
int j, k, l;
k = SIZE-1;
if (i<1 || i> listLength(L)+1) return ERROR;
j = MALLOC_SLL(L);
if (j)
{
for (l=1; l<i; ++l)
{
k = L[k].next;
}
L[j].data = e;
L[j].next = L[k].next;
L[k].next = j;
return OK;
}
return ERROR;
}
Status deleteElem(SLL L, int i)
{
ElemType e;
int j, k, d;
k = SIZE-1;
if (i < 1 || i > listLength(L)) return ERROR;
for (j=1; j<i; ++j)
{
k = L[k].next;
}
d = L[k].next;
e = L[d].data;
L[k].next = L[d].next;
FREE_SLL(L, d);
return OK;
}
Status visit(ElemType c)
{
printf("%c",c);
return OK;
}
Status listTraverse(SLL L)
{
int i=SIZE-1;
for (;L[i].next;)
{
i = L[i].next;
visit(L[i].data);
}
return OK;
}
int main()
{
SLL L;
Status i;
i=initList(L);
printf("初始化L后:L.length=%d\n",listLength(L));
i=insertElem(L,1,'F');
i=insertElem(L,1,'E');
i=insertElem(L,1,'D');
i=insertElem(L,1,'B');
i=insertElem(L,1,'A');
printf("\n在L的表头依次插入FEDBA后:\nL.data=");
listTraverse(L);printf("\n");
i=insertElem(L,3,'C');
printf("\n在L的“B”与“D”之间插入“C”后:\nL.data=");
listTraverse(L);printf("\n");
i=deleteElem(L,1);
printf("\n在L的删除“A”后:\nL.data=");
listTraverse(L);printf("\n");
return 0;
}
打印结果:
初始化L后:L.length=0
在L的表头依次插入FEDBA后:
L.data=ABDEF在L的“B”与“D”之间插入“C”后:
L.data=ABCDEF在L的删除“A”后:
L.data=BCDEF