c语言静态链表程序,C语言实现静态链表

/*

* 数组的第一个和最后一个元素作为特殊元素处理,不存数据。

* 把未被使用的数组元素称为备用链表。

* 数组的第一个元素,即下标为0的元素的cur存放备用链表的第一个结点的下标。

* 数组中最后一个元素的cur则存放第一个有数值的元素的下标,相当于单链表头结点,整个链表为空时为0。

*/

#include

#define MAXSIZE 7

#define OK 1

#define ERROR 0

typedef int Status;

typedef int ElemType;

typedef struct staticList

{

ElemType dat;

int cur; //相当于单链表的next指针,存放该元素的后继在数组中的下标

}StaticLinkList[MAXSIZE];

int ListLength(StaticLinkList L);

void Free_SLL(StaticLinkList space, int k);

/*

* 将一维数组space中各分量链成一备用链表

* space[0].cur为头指针, "0"表示空指针

*/

Status InitList(StaticLinkList space)

{

if(MAXSIZE <= 0)

return ERROR;

int i;

for(i = 0; i < MAXSIZE-1; i++)

space[i].cur = i+1;

space[i].cur = 0;

return OK;

}

/* 若备用空间链表非空,则返回分配的结点下标,否则返回0 */

static int Malloc_SLL(StaticLinkList space)

{

int index = space[0].cur;

if(index != 0)

space[0].cur = space[index].cur;

return index;

}

/* 在L中第i个元素之前插入新的数据元素e */

Status ListInsert(StaticLinkList L, int i, ElemType e)

{

int length = ListLength(L);

if(i < 1 || i > length+1 || length == MAXSIZE-2)

{

printf("Insert error!\n");

return ERROR;

}

int newIndex = Malloc_SLL(L);

if(newIndex == 0)

return ERROR;

L[newIndex].dat = e;

int index = MAXSIZE-1;

for(int one = 1; one < i; one++)

index = L[index].cur;

L[newIndex].cur = L[index].cur;

L[index].cur = newIndex;

return OK;

}

/* 删除在L中第i个数据元素e */

Status ListDelete(StaticLinkList L, int i)

{

int length = ListLength(L);

if(i < 1 || i > length)

{

printf("Delete error!\n");

return ERROR;

}

int index = MAXSIZE-1;

for(int one = 1; one < i; one++)

index = L[index].cur;

int del = L[index].cur;

L[index].cur = L[del].cur;

Free_SLL(L, del);

return OK;

}

/* 将下标为k的空闲结点回收到备用链表 */

void Free_SLL(StaticLinkList space, int k)

{

space[k].cur = space[0].cur;

space[0].cur = k;

}

/* 初始条件:静态链表L已存在。操作结果:返回L中数据元素个数 */

int ListLength(StaticLinkList L)

{

int len = 0;

for(int index = MAXSIZE-1; L[index].cur != 0; len++)

index = L[index].cur;

return len;

}

void PrintList(StaticLinkList L)

{

for(int index = MAXSIZE-1; L[index].cur != 0; printf("%d ", L[index].dat))

{

index = L[index].cur;

}

printf("\n");

}

int main(void)

{

StaticLinkList list;

InitList(list);

printf("Length : %d\n", ListLength(list));

ListInsert(list, 1, 10);

ListInsert(list, 1, 9);

ListInsert(list, 1, 8);

ListInsert(list, 3, 7);

ListInsert(list, 1, 6);

ListInsert(list, 1, 5);

PrintList(list);

printf("Length : %d\n", ListLength(list));

ListDelete(list, 5);

ListDelete(list, 5);

ListInsert(list, 1, 5);

ListInsert(list, 1, 5);

PrintList(list);

/*for(int i = 0; i < MAXSIZE; i++)

printf("%d ", list[i].cur);

printf("\n");

for(int i = 0; i < MAXSIZE; i++)

printf("%d ", list[i].dat);

printf("\n");*/

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值