线性表——静态链表

定义:用数组描述的链表叫做静态链表(游标实现法)

代码实现

/*线性表的静态链表存储结构*/
#define MAXSIZE 1000        /*假设链表的最大长度是1000,尽量设大一些,防止溢出*/
typedef struct
{
    ElemType data;
    int cur;                /*游标(cursor),为0时表示无指向*/
} Component, StaticLinkList[MAXSIZE];

PS: 通常,我们将未使用的数组元素称为备用链表。而数组第一个元素,即下标为0的元素的cur就存放备用链表的第一个结点的下标;而数组最后一个元素的cur则存放第一个有数值的元素的下标,相当于头结点(有些第二个存)

初始化

Status InitList(StaticLinkList space)
{
    int i;
    for(i=0; i<MAXSIZE-1; i++)
        space[i].cur = i+1;
    space[MAXSIZE-1].cur = 0;         /*目前链表为空,所以头结点为NULL*/
    return True;
}

静态链表的插入

算法思路:用静态模拟动态链表结构的存储空间的分配,需要时申请,无用时释放

int Malloc_SLL(StaticLinkList space)
{
    int i = space[0].cur;
    if(space[0].cur)
         space[0].cur= space[i].cur;   /*修正备用链表所在位置*/

    return i;
}

实现插入

假设在“乙”和“丁”之间插入“丙”

  • 找到“乙”,并将乙的cur改为“丙”所在位置
  • 找到“丁”,将丙的cur改为“丁”所在位置

成功实现链表中的,脱钩,上钩过程代码实现

Status ListInsert(StaticLinkList L, int i, ElemType e)
{
    int j,k,l;
    k = MAXSIZE - 1;
    if(i < 1 || i > ListLength(L) + 1)    /*插入位置不合法*/
        return False;
    j = malloc_SLL(L);
    if(j)
    {
        L[j].data = e;
        for(l = 1; l <= i - 1; l++)       /*找到第i个元素之前的位置*/
            k = L[k].cur;                 /*妙,进行i-1次数,让k=L[i].cur*/
        L[j].cur = L[k].cur;
        L[k].cur = j;
        return Ture;
    }
    return False;
}

附上删除操作:基本相同,自行发挥

静态链表的优缺点

优点:在插入删除操作时,只需要修改游标,不需要移动元素,从而改进了在顺序存储结构中的插入和删除操作需要移动大量元素的缺点缺点

  • 没有解决连续存储分配带来的表长难以确定的问题
  • 失去了顺序存储结构随机存取的特性
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值