静态链表 数据结构C语言版

0.说明

最后一个游标为第一个有数据元素的下标
第一个游标为第一个没有元素的下标
其他游标为下一元素的下标
第一个和最后一个不存放数据

1.初始定义

#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define MAXSIZE 10
typedef int Status;
typedef int ElemType;

//变量定义
typedef struct{
    ElemType data;//数据
    int cur;//游标
}Component,StaticLinkList[MAXSIZE];

2.创建空表

Status InitList(StaticLinkList &space){//初始化 建立空的静态链表
    for(int i = 0;i<MAXSIZE-1;i++){	//循环初始化
        space[i].cur = i+1;	//设置游标为下一元素的下标
    }
    space[MAXSIZE-1].cur = 0;	//最后一个游标为0
    return OK;
}

3.获取使用长度

int ListLength(StaticLinkList space){//获取使用长度
    int j = 0;
    int i = space[MAXSIZE-1].cur;	//获得第一个数据的下标
    while(i){	//因为设置最后一个有数据元素的游标为0,所以当i!=0时 进行计数
        i = space[i].cur;	
        j++;
    }
    return j;	//返回静态链表使用长度
}

4.添加数据

Status AddElem_1(StaticLinkList &space){//添加数据1
    while(1){
        scanf("%d",&space[ListLength(space)+1].data);	//将数据输入到数组下标为长度+1的位置
        if(space[ListLength(space)+1].data == 0){	//输入0结束
            break;
        }
        space[ListLength(space)+1].cur = 0;		//设置当前即最后一个元素的游标为0
        if(ListLength(space)){//当长度不为0时 更改前元素的游标
            space[ListLength(space)].cur = ListLength(space) + 1;	//即将输入的前面的元素的游标改为当前最后一个元素的下标

        }
        if(ListLength(space)){	//第一元素的游标变为最后一个元素的下一元素的下标
            space[0].cur = ListLength(space) + 1;//当前输入不是第一个元素时
        }
        else{
            space[0].cur = ListLength(space) + 2;//当前输入为第一个元素时
        }
        space[MAXSIZE-1].cur = 1;	//设置最后一个元素的游标为第一个含数据元素的下标 即1
    }
    return OK;

5.添加数据

Status AddElem_2(StaticLinkList &space){//添加数据2
    while(1){
        scanf("%d",&space[space[0].cur].data);		//将数据加入到第一个没有数据的下标处
        if(space[space[0].cur].data == 0){	//输入为0结束
            break;
        }
        space[0].cur = space[space[0].cur].cur;	//更改第一个不含数据的下标为最后输入元素的游标(即指向的下一元素的下标)
        space[space[0].cur-1].cur = 0;	//设置最后一个元素的游标为0
        if(ListLength(space)){
            space[space[0].cur-2].cur = space[0].cur-1; //将最后输入元素的上一元素的游标改为最后元素的下标
        }
        space[MAXSIZE-1].cur = 1;	//设置最后的元素游标为1(即第一个含数据元素的下标)
    }
    return OK;
}

6.静态链表遍历

void PrintList(StaticLinkList space){//静态链表遍历
    int ptr = 1;	//初始下标为1
    while(space[ptr].cur){	//当游标不为0时
        printf("%2d  ",space[ptr].data);//输出数据
        ptr = space[ptr].cur;	//将下标改为当前元素的游标(即下一元素的下标)
    }
    printf("%2d  ",space[ptr].data);//最后输出一次数据
}

7.空间释放

void Free_SLL(StaticLinkList &space,int j){//静态链表释放空间
    space[j].cur = space[0].cur;	//将当前游标改为未使用的下一元素的下标
    space[0].cur = j;	//更改未使用的第一元素的下标为j
}

8.获得空闲分量

int Malloc_SLL(StaticLinkList space){//获得空闲分量的下标
    int i = space[0].cur;
    if(space[0].cur){
        space[0].cur = space[i].cur;//更改space[0].cur存放的未使用的下标 (后移一位)
    }
    return i;	//返回空闲分量的下标
}

9.查找操作

int LocateElem(StaticLinkList space,int e){//查找第1个值为e的元素 返回位序 没有则返回0 (返回的是数组的下标)
    int i = space[MAXSIZE-1].cur;	//设i为第一个数据的下标
    while(i && space[i].data!=e){	//遍历查找
        i = space[i].cur;
    }
    return i;	//返回位序
}

10.插入操作

Status ListInsert(StaticLinkList &space,int i,int e){//静态链表插入 在第i个元素之前插入一个数据
    int j,k,t;
    k = MAXSIZE - 1;//数组的最后一个元素
    if(i<1||i>ListLength(space)+1){	//非法
        return ERROR;
    }
    j = Malloc_SLL(space);//j获取空闲分量下标
    if(j){
        space[j].data = e;	//j!=0时
        for(t = 1;t<=i-1;t++){	//遍历找到第i个元素前一元素的下标
            k = space[k].cur;
        }
        space[j].cur = space[k].cur;	//将游标设置为第i元素的下标
        space[k].cur = j;	//更改原第i元素的前一元素的游标为当前元素的下标
        return OK;
    }
    return ERROR;
}

11.删除操作

Status ListDelete(StaticLinkList &space,int i,int &e){//静态链表删除第i个元素 用e返回其值(第i个元素不一定对应数组的下标为i)
    int j,k;
    if(i<1 || i>ListLength(space)){	//i值不合法
        return ERROR;
    }
    k = MAXSIZE-1;	//k为最后元素的下标
    for(j=1;j<=i-1;j++){	//找出第i个元素的前一元素的下标
        k = space[k].cur;
    }
    j = space[k].cur;//得到需要删除元素的下标
    space[k].cur = space[j].cur;//改变删除前面元素的游标为删除后面元素的下标
    e = space[j].data;	//e返回其值
    Free_SLL(space,j);//释放空间
    return OK;
}

输入举例

输入4个数据 MAXSIZE = 7

游标:5 2 3 4 0 6 7 1
下标:0 1 2 3 4 5 6 7

——————END——————


作者注:

记录学习,分享经验。
有兴趣可以关注博主,以后还会持续更新内容哦~


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

苡荏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值