2.3线性表的链式表示和实现(2)-静态链表(1)

本文深入探讨了静态链表的概念及其实现方式,包括如何利用一维数组模拟链表的存储结构,介绍了备用链表和游标的应用,并给出了静态链表中定位、插入等基本操作的具体算法。

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

静态链表
补充一下之前的理解,感觉怪怪的。
LinkList&La,表示La就是理解为头结点。
补充一下知识点:
pa?pa:pb;
if(pa)
pa->next = pa
else
pc->next = pb

需要重点理解的盖面:
1.备用链表
2.游标

//一维数组来描述线性链表:
//----------线性表的静态单链表存储结构-----
#define MAXSIZE 1000//链表的最大长度
typedef struct 
{
    ElemType data;
    int cur;
}component,SLinkList[MAXSIZE];

假设S为SLinkList型变量
(1)S[0].cur 指示第一个结点在数组中的位置
(2)设i=S[0].cur,则S[i].data存储线性表中的第一个数据元素
(3)s[i].cur指示第二个结点在数组中的位置
一般情况:第i个分量表示链表的第k个节点。
S[i].cur指示第k+1个结点的位置。
静态链表中实现线性表的操作和动态链表相似
以整型游标i代替动态指针p。
i = S[i].cur的操作实为指针后移,类似于p=p->next

///////////////////////////////////////////////
//静态链表中实现定位函数的LocateElem如下算法所示:
int LocateElem_SL(SlinkList S,ELemType e)
{
    //在静态单链性表L中查找第一个值为e的元素。
    //若找到,则返回它在L中的位序,否则返回0。
    i = S[0].cur;       //i指示表中第一个结点
    while(i&&s[i].data!=e)i=S[i].cur;
    return i;
}//LocateElem_SL

静态链表的插入:
将所有未被使用过的以及被删除的分量用游标链成一个备用的链表
每当进行插入时便可从未被使用过的以及第一个结点作为待插入的新节点
反之在删除时将从链表中删除的结点连接到备用链表上。

运算集合(A-B)U(B-A)为例进行静态链表的算法
过程:假设由终端输入集合元素,
(1)先建立表示集合A的静态链表S
(2)而后在输入集合B的元素查找S表
(3)若存在和B相同的元素,则从S表中删除之,否则将此元素插入S表
为了安全,我们分为三个过程:
1_将整个数组空间初始化一个链表
2_从备用空间取得一个结点
3_将空闲结点链接到备用链表上,分表如算法所示

void InitSpace_SL(SLink &space)
{
    //将一维数组space的各分量链成一个备用链表,space[0].cur为头指针
    //"0"表示空指针
    for(i=0;i<MAXSIZE-1;++i)space[i].cur = i+1; //是不是移动位置
    space[MAXSIZE-1].cur = 0'
}// InitSpace_SL

int Malloc_SL(SLlink&space)
{
    //若备用空间链表非空,则返回分配结点的下标,否则返回0
    i = space[0].cur;//把第几个节点给i
    if(space[0].cur) space[0].cur = space[i].cur;
    return i;
}// Malloc_SL

int Free_SL(Slinklist &space ,int k)
{
    //将下标为k的空闲结点回收到备用链表中
    space[k].cur = space[0].cur;
    space[0].cur = k;
}//Frel_SL
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值