数据结构--静态链表

//静态链表
#include <stdio.h>
#define MAX_SIZE 20
#define ElemType char

typedef struct ListNode
{
    ElemType data;
    int cur;//静态链表中的游标
}ListNode;
//静态链表实际上就是一个结构体数组
typedef ListNode StaticList[MAX_SIZE];
//初始化
void InitSList(StaticList& space)
{
    //初始化备用空间pool(即下标1~MAX_SIZE-1),其中下标为1的空间是备用空间的头结点,用于指向可使用的备用空间
    for (int i = 1; i < MAX_SIZE - 1; ++i)
    {
        //备用区每个空间的游标指向下一个空间
        space[i].cur = i + 1;
    }
    //备用区的最后一个空间,后无可以空间,游标为0
    space[MAX_SIZE - 1].cur = 0;
    //初始化时为空的静态链表,无数据结点,头结点的游标为-1
    space[0].cur = -1;
}
//节点数据显示
void ShowSList(StaticList& space)
{
    int i = space[0].cur;//从第一个数据节点开始搜索
    while (i != -1)
    {
        printf("%c-->", space[i].data);
        i = space[i].cur;//p=p->next;
    }
    printf("Nul.\n");
}
//节点申请
int Malloc_SL(StaticList& space)
{
    int i = space[1].cur;
    //如果备用区中还有可用空间那么就进行分配(更改备用区头指针的指向)
    if (space[1].cur != 0)
        space[1].cur = space[i].cur;
    return i;
}
//静态链表的头插
void Insert(StaticList& space, ElemType x)
{
    int i = Malloc_SL(space);//申请空间
    if (i == 0)//如果为零表示申请空间失败
    {
        printf("申请节点空间失败.\n");
        return;
    }

    space[i].data = x;
    //如果之前静态链表中无数据结点,需要更改头结点的指向
    if (space[0].cur == -1)
    {
        space[i].cur = -1;
        //space[0].cur = i;
    }
    else //如果之前已经有数据结点那么直接头插
    {
        space[i].cur = space[0].cur;
    }
    space[0].cur = i;
}
//释放节点(空间回收)
void Free_SL(StaticList& space, int k)
{
    //将要回收的空间重新加入到备用空间
    space[k].cur = space[1].cur;
    space[1].cur = k;
}
//头删
void Delete(StaticList& space)
{
    int i = space[0].cur;
    space[0].cur = space[i].cur;
    //释放删除节点的空间
    Free_SL(space, i);
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值