静态链表的实现(用一维数组描述链表)
数据类型
typedef struct { ElemType data; //数据 int cur; //下标 链表的顺序存储(一维数组描述链表) }component,SLinkList[MAXSIZE];
静态链表和普通链表所不同的是需要用户自定义malloc和free这两个函数。。
//在备用链表中取出一个节点使用 int Malloc_SL(SLinkList space) { //将可以使用的链表的空间下标返回 int i = space[0].cur; if (i) { space[0].cur = space[i].cur; } return i; } //将该节点回收备用链表 void Free_SL(SLinkList space, int k) { //将下标为k的空闲节点回收备用链表 space[k].cur = space[0].cur; space[0].cur = k; }
上述两个函数描述了两个链表(一个是备用链表一个使用中的链表)使用游标cur(指示器)代替指针只是结点在数组中的想对位置。。。
添加数据:只需要改变游标值不需要移动位置:
//在指定位置插入元素 Status Insert_SL(SLinkList L,int pos, ElemType e) { /*if (pos < 0 || pos > getLenghtSL(L)+1) { return ERROR; }*/ // 找到要插入指定位置的地址 int i = 0; int k = MAXSIZE - 1; int j = Malloc_SL(L); //首先要有元素 if (j) { for (i = 1; i < pos; i++) { //遍历查找(k这里相当于指针) k = L[k].cur; } //插入元素 L[j].data = e; L[j].cur = L[k].cur; //把最后一个位置永远的往后移动(理解) L[k].cur = j; return OK; } return ERROR; }
删除元素:原理和添加元素一样(改变游标的位置):
//删除元素并返回被删除元素 void Del_SL(SLinkList L,int pos ,ElemType *e) { //删除第i个元素 //if (pos < 1 || pos > getLenghtSL(L)) //{ // return ERROR; //} int i = 0; int j = L[MAXSIZE - 1].cur; for (i = 1; i < pos; i++) { j = L[j].cur; } int k = L[j].cur; //删除j节点 *e = L[j].data; L[j].cur = L[k].cur; Free_SL(L,k); }
静态链表必要的其他操作:
//初始化 void InitSpace_SL(SLinkList space) { //将一维数组转化为链表 //0 表示空指针 int i = 0; for (i = 0; i < MAXSIZE-2; i++) { space[i].cur = i + 1; } space[MAXSIZE - 1].cur = 0;//0表示NULL space[MAXSIZE - 2].cur = 0; }
//打印数据
void print_Sp(SLinkList space)
{
//将数组初始化为一个备用链表 space[0]为头指针
int k = MAXSIZE - 1;
while (space[k].cur)
{
k = space[k].cur;
printf("%d:%d ", space[k].data,space[k].cur);
}
}
测试数据:
Status main() { int i = 0; //数组转换为链表 SLinkList space; ElemType e; InitSpace_SL(space); printf("表长:%d \n", getLenghtSL(space)); Insert_SL(space,1,100); Insert_SL(space,2,200); Insert_SL(space,3,300); Insert_SL(space,4,400); Insert_SL(space,5,500); printf("表长:%d \n", getLenghtSL(space)); print_Sp(space); printf("\n"); Del_SL(space, 2, &e); printf("删除%d\n", e); print_Sp(space); printf("\n"); system("pause"); return OK; }