静态链表的操作

using namespace std;
#include<iostream>
#define Max_size 100
#define OK 1
#define Error 0
typedef int Elemtype;
typedef struct StaticLinkNode
{
    Elemtype date;
    int cur;
}StaticLinkNode,StaticLinkList[Max_size];
/*静态链表,用数组来描述的链表,我们对数组的第一个
和最后一个元素不存数据,通常,我们把数组中未使用的
剩余空间称为备用链表。数组中,第一个元素,即下标为
0的cur空间存放备用链表的第一个元素的下标,最后一个
元素的cur存放第一个有数值的元素下标
*/
Elemtype InitList(StaticLinkList space)
{
    int i;
    for (i = 0; i < Max_size; i++)
    {
        space[i].cur = i + 1;//cur从1开始,而数组从0开始,故加1(数组下标0不存数据元素);
        space[Max_size - 1].cur = 0;//  初始化不存在数据元素而规定数组的最后一个下标不存数据,
                                   //存第一个数值所在的下标
        return OK;
    }
}//初始化静态链表的cur;
int Malloc_SSL(StaticLinkList space)//备用链表的非空
{
    int i = space[0].cur;
    if (space[0].cur)
    {
        space[0].cur = space[i].cur;
            /* 经过此过程,就拿出此元素要使用了,
               备用链表的第一个空间就存在数值了,
               把原本第二个的备用链表的空间作为
               第一个,故要更新space[0].cur. */
    }
    return i;
}//此方法为后续的插入操作完成了部分工作,
//后续的方法只需调用就可以了。
void Free_SSL(StaticLinkList space, int k)
{
    space[k].cur = space[0].cur;//将备用链表的原第一个位置给space[k].cur,使被删除元素为备用链表的第一个位置。
    space[0].cur = k;//删除元素的那个位置就为备用链表的第一个位置。
}
int ListLength(StaticLinkList space)
{
    int j=0;//计数器,统计元素数目
    int i = space[Max_size-1].cur;
    while (i)
    {
        i = space[i].cur;
        j++;
    }
    return j;
}

Elemtype StaticLinkListInster(StaticLinkList space, int i, Elemtype e)//i为插入的位置,e为date的值
{
    int j, k, l;
    k = Max_size - 1;
    if (i<1 || i>ListLength(space) + 1)//ListLength(L)用来计算链表的长度,因为有新加入的元素,故加1;
    {
        return Error;
    }
    j = Malloc_SSL(space);//找出已分配好的空间下标
    if (j)
    {
        space[j].date = e;
        for (l = 1; l <= i - 1; l++)//for循环用来找出插入位置的前一位置的下标
        {                          
            k = space[k].cur;
        }     
            space[j].cur = space[k].cur;//新加入元素的
            space[k].cur = j;//新加入的元素在k(即i-1)之后,将插入位置前一元素的cur更新为新加入元素在数组中的下标。
            return OK;
        }
       return Error;
    }
Elemtype ListDelete(StaticLinkList L, int i)
{
    int j, k;
    if (i<1 || i>ListLength(L))
    {
        return Error;
    }
    k = Max_size - 1;
    for (j = 1; j <= i - 1; j++)//与上述一样,找出待删除前一位置的下标
    {
        k = L[k].cur;
    }
    j = L[k].cur;//j为删除元素的下标
    Free_SSL(L, j);
    return OK;
}
int main()
{
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值