数据结构-静态链表(初始化、插入、删除等基本操作)

静态链表


一、简介

用数组代替指针或引用来描述单链表,即用数组描述的链表叫做静态链表,这种描述方法叫做游标实现法。

静态链表结构

游标62345071
数据-ABCDE--
下标0123456MAX-1

静态链表需要对数组的第一个和最后一个元素作为特殊元素处理,不存数据。通常把未被使用的数组元素称为备用链表。而数组第一个元素,即下标为0的元素的cur就存放备用链表的第一个结点的下标;而数组的最后一个元素的cur则存放第一个有数值的元素的下标,相当于单链表中的头结点作用,当整个链表为空时,则为0。

代码实现


静态链表存储结构及宏定义

/*待处理的数据类型*/
typedef int Elemtype;

/*定义处理的静态链表最大值*/
#define MAX_SIZE 20

/*函数返回状态*/
typedef enum{
    success,
    fail,
}Status;

/*静态链表结构*/
typedef struct Stack{
    Elemtype data;
    int cur;
}StackLink,*PtrStackLink;

静态链表初始化

/****************************************************
 * 函数名称:静态链表初始化
 * 传入参数:
 *           PtrStackLink space 待初始化的静态链表
 * 返回值:  success 成功
 *           fail    失败
******************************************************/
Status LinkInit(PtrStackLink space)
{
    int i;
    Status outcome = fail;
    if(space)
    {
        for(i = 0; i < MAX_SIZE-1; i++)
        {
            space[i].cur = i+1;
        }
        space[MAX_SIZE-1].cur = 1;/*最后一个元素不存数据*/
        outcome = success;
    }
    return outcome;
}

获得静态链表的长度

/**********************************************************
 * 函数名称:LengthList(PtrStackLink space)
 * 功能描述:获得静态链表的长度
 * 传入参数:PtrStackLink space   待传入的静态链表
 * 返回值    静态链表长度
 **********************************************************/
int LengthList(PtrStackLink space)
{
    int i,j = 0;
    i = space[MAX_SIZE -1].cur;
    while (i)
    {
        i = space[i].cur;
        j++;
    }
    return j;
}

获得静态链表最后一个元素的下标

/*****************************************************************
 * 函数名称:Malloc_Sll(PtrStackLink space)
 * 功能描述:获得静态链表最后一个元素的下标
 * 输入参数:PtrStackLink space 输入待插入的静态链表
 * 返回值:  静态链表最后数据的下标
 *****************************************************************/
int Malloc_Sll(PtrStackLink space)
{
    int i = space[0].cur;
    if(space[0].cur)
    {
        space[0].cur = space[i].cur;/*第一个没有数据的游标改为新的最后一个没有数据的下标*/
    }
    return i;/*待插入位置的下标*/
}

在静态链表的第i个位置之前插入元素

/*****************************************************************
 * 函数名称:ListInsert(PtrStackLink space, int i, Elemtype e)
 * 功能描述:在静态链表的第i个位置之前插入元素e
 * 输入参数:PtrStackLink space 输入待插入的静态链表
 *           int i              在第i个元素之前插入
 *           Elemtype e         待插入的数据
 * 返回值:  success            成功
 *           fail               失败 
 *****************************************************************/
Status ListInsert(PtrStackLink space, int i, Elemtype e)
{
    Status _outcome_ = fail;
    int j,k,l;
    k = MAX_SIZE-1;/*最后一个元素*/
    j = Malloc_Sll(space);/*待插入位置下标*/
    if(i < 1 || i > LengthList(L))/*插入位置是否合法以及是否超出范围*/
    {
        space[j].data = e;
        for (l = 1; l <= i-1; l++)
        {
            k = space[k].cur;/*最后一个的游标即第一个元素的下标1*/
        }
        space[j].cur = space[k].cur;
        space[k].cur = j;
        space[0].cur = space[j].cur;/*第一个位置的元素的游标改为插入元素的下标*/
        _outcome_ = success;
    }
    return _outcome_;
}

删除静态链表的第i个元素

/*****************************************************************
 * 函数名称:ListDelete(PtrStackLink space, int i)
 * 功能描述:删除静态链表的第i个元素
 * 输入参数:PtrStackLink space 输入的静态链表
 *           int i              删除数据所处位置
 * 返回值:  success            成功
 *           fail               失败 
 *****************************************************************/
Status ListDelete(PtrStackLink space, int i)
{
    Status _outcome_ = success;
    int j,k,l;
    k = MAX_SIZE - 1;/*最后一个元素的下标*/
    if(i < 1 || i > LengthList(space))
    {
        success = fail;
    }
    for(j = 1; j <= i-1;j++)
    {
        k = space[k].cur;/*待删除的元素的下标*/
    }
    j = space[k].cur;
    space[k].cur = space[j].cur;/*删除第i个元素*/

    space[k].cur = space[0].cur;/*回收为备用链表*/
    space[0].cur = k;
}

🙃
o_o …
👍

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
静态链表是一种使用数组实现的链表结构。它通过数组中的元素自身的指针来实现链表的连接关系。以下是静态链表基本操作: 1. 初始化:创建一个包含足够多元素的数组,每个元素包含两个字段,一个用于存储数据,另一个用于存储指向下一个元素的索引。初始化时,设置数组中所有元素的指针字段为-1,表示链表为空。 2. 插入插入操作将新元素插入静态链表中的指定位置。首先找到一个空闲位置并将新元素插入其中,然后将前一个元素的指针字段指向新元素,在将新元素的指针字段指向原来位置的后继元素。 3. 删除删除操作将静态链表中指定位置的元素移除。首先将要删除的元素的前一个元素的指针字段指向要删除元素的后继元素,然后将要删除元素所在位置设置为空闲。 4. 查找:查找操作可以根据给定的关键字或索引在静态链表中找到对应的元素。可以通过遍历整个链表,逐个比较每个节点中存储的值与给定关键字或索引进行匹配。 5. 更新:更新操作用于修改静态链表中指定位置元素的值。首先找到要更新的元素位置,然后将其值进行修改。 需要注意的是,静态链表插入删除操作可能需要额外的空间来存储空闲位置的索引信息,以便快速找到可用位置。另外,由于静态链表使用数组实现插入删除操作可能会涉及元素的移动,因此效率较低,适用于对数据的频繁查找而不是插入删除的场景。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值