数据结构笔记(三)静态链表的实现和基本操作

一、静态链表的定义

用数据替代指针,来描述单链表。首先,数据的元素由两个数据域组成,data和cur。数据域data,用来存放数据元素,即要处理的数据;游标cur相当于单链表中的next指针。

//线性表的静态单链表存储结构
#define MAXSIZE 1000
typedef struct{
    ElemType data;
    int cur;
}component,SLinkList[MAXSIZE];

此外,我们对数据第一个和最后一个元素作为特殊元素处理,不存数据。把未被使用的数组元素称为备用链表。而数组第一个元素,即下标为0的元素的cur就存放备用链表的第一个结点的下标;而数组的最后一个元素的cur则存放第一个数值的元素的下标,相当于单链表中头结点。
这里写图片描述

上图为初始化的数组状态,下面是代码:

Status InitSpace_SL(SLinkList &space){
    //将一组数组space中各分量链成一个备用链表,space[0].cur为头指针,
    //“0”表示空指针
    int i;
    for(i=0;i<MAXSIZE-1;i++){
        space[i].cur=i+1;
    }
    space[MAXSIZE-1].cur=0;
    return  OK;
}


假设已经将数据存入静态链表,如下:
这里写图片描述

此时,“甲”这里就存有下一元素“乙”的游标2,“乙”则存有下一元素“丁”的下标3。而“己”是最后一个有值元素,所以它的cur设置为0。而最后一个元素的cur则因“甲”是第一个有值元素而存有它的下标为1。而第一个元素则因空闲空间的第一各元素下标为7,所以它的cur存有7.

二、静态链表的插入操作

1、首先要重写malloc函数

int Malloc_SL(SLinkList &space){//若备用空间链表非空,则返回分配的结点下标,否则返回0.
    int i=space[0].cur;//当前数组第一个元素的cur存的值
    if(space[0].cur){
        space[0].cur=space[i].cur;
    }
    return i;


//在L中第i个元素之前插入新的数据元素e
Status ListInsert(SLinkList &L,int i,ElemType e){
    int i,k,l;
    k=MAXSIZE-1;//注意k首先是最后一个元素的下标
    if(i<1||i>ListLength(L)+1){
        return ERROR;
    }
    j=Malloc_SL(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;
}

ListLength函数代码见最后

三、静态链表的删除操作

1、首先重写free函数

//将下标为k的空闲结点回收到备用链表
void Free_SL(SLinkList &space,int k){
    space[k].cur=space[0].cur;//把第一个元素cur赋值给要删除的分量cur
    space[0].cur=k;//把要删除的分量下标赋值给第一个元素的cur
}
//删除在L中第i个数据元素e
Status ListDelete(SLinkList &L,int i){
    int j,k;
    if(i<1||i>ListLength(L)){
        return ERROR;
    }
    k=MAXSIZE-1;
    for(j=1;j<=i-1;j++){
        k=L[k].cur;
    }
    j=L[k].cur;
    L[k].cur=L[j].cur;
    Free_SL(L,j);
    return OK;
}
//初始化条件:静态链表L已经存在。操作结果:返回L中数据元素个数
int ListLength(SLinkList L){
    int j=0;
    int i=L[MAXSIZE-1].cur;
    while(i){
        i=L[i].cur;
        j++;
    }
    return j;
}
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值