线性表->静态链表(未完)

本文介绍了一种特殊的链表实现——静态链表。静态链表利用数组实现,通过游标代替传统链表中的指针,有效地管理了备用链表。文章详细讲解了静态链表的初始化过程、插入操作等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/****************************************仅作了解,几乎用不到**************************************
静态链表:数组元素都是由两个数据域组成,data 和 cur. 也就是说数组的每个下标都对应一个data和一个cur.
数据域data用来存放数据元素,及我们需要处理的元素;而游标则相当于单链表中的next指针,存放着该元素的后继在数组中的下标。

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

************************************************************************************************/
#include <malloc.h>

#define MAXSIZE 1000  //存储空间初始分配量,为了方便数据插入,通常需要大点的数组
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0

typedef int ElemType;   //ElemType 数据类型
typedef int Status;

typedef struct
{
    ElemType data;  //数据
    int cur;        //游标,0为无向游标
}Component, StaticLinkList[MAXSIZE];


// 初始化数组状态
Status InitList(StaticLinkList space)
{
    int i;
    for( i = 0; i<MAXSIZE; i++)
        space[i].cur = i+1;

    space[MAXSIZE-1].cur = 0;

    return OK;
}

// 静态链表的插入操作
/* 将所有未被使用过的以及已经被删除的分量用游标链成一个备用表,每当需要插入时,遍可以从备用链表中取得第一个结点作为待插入新结点 */
/*若备用空间链表非空,则返回分配的结点下标,否则返回0*/

int Malloc_SLL(StaticLinkList space)
{
    int i = space[0].cur;   //当前数组的第一个元素的cur元素寸的值,就是要返回的第一个备用空闲的下标

    if(space[0].cur)
        space[0].cur = space[i].cur;    //由于要拿出一个分量来使用,所以我们就得把他的下一个分量用来做备用

    return i;
}

/* 在L中的第i个元素之前插入新的数据元素e */
Status ListInsert(StaticLinkList L, int i, ElemType e)
{
    int j,k,i;
    k = MAXSIZE - 1; //注意K首先是最后一个元素的下标

    if(i<1 || i>ListLength(L) + 1)
        return ERROR;

    j = Malloc_SLL(L);  //获得空闲分量的下标

    if(j)
    {
        L[j].data = e;  //将数据赋值给此分量的data
        for(l = 1; l<= i - 1; l++)  //找到第i个元素之前的位置
            k = L[k].cur;

        L[j].cur = L[k].cur;   //把第i个元素之前的cur赋值给新的元素cur
        L[k].cur = j;   //把新元素的下标赋值给第i个元素之前元素的cur

        return OK;
    }

    return ERROR;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值