静态链表的插入详解

思路:开辟一段连续的内存段后
把下标为0的内存块作为起始节点,初始化时把这个节点的cur置为-1,而在后续的遍历操作,自然cur值为-1就是终止节点。
把下标为1的内存块记录可分配的索引下标,如果不这样的话,每次我们插入还要遍历去寻找可分配的索引下标,显然这样速度会很慢,后续操作,每次申请节点,可分配节点的索引就是1号节点的cur值。

具体操作

//静态链表
#define MAX 100
#define ElemType char

typedef struct ListNode
{
    ElemType data;
    int      cur;   //静态链表中的游标
}ListNode;

//静态链表实际上就是一个结构体数组
typedef ListNode StaticList[MAX];
//ListNode 是一个结构体,而 StaticList 是一个数组类型,实际上是 ListNode 的数组。
//初始化
void InitSList(StaticList &p){
    for(int i=1;i<MAX;++i){
        p[i].cur=i+1;
    }
    p[0].cur=-1;
    p[MAX-1].cur=0;
}
// 分配静态链表节点的空间
int Malloc_SL(StaticList &p)
{
    //p[1]记录可分配的空间索引
    int i = p[1].cur;
    return i;  // 返回分配的节点索引
}
//头插
void Insert(StaticList &p,ElemType x){
    int i= Malloc_SL(p);
    if(i==0){
        printf("申请节点空间失败.\n");
        return;
    }
    p[i].data=x;
    if(p[0].cur==-1){
        //特殊处理,需要判断第一次的head节点是不是-1,因为这个比较特殊
        p[0].cur=p[1].cur;
    }else{
        //如果head节点不是-1,那么改变后面节点的cur,使它的cur能指向插入节点的索引
        p[i-1].cur=p[1].cur;
    }
    //记录可分配的索引,这个可分配的索引就是插入节点原先的cur值,后面再置为-1
    p[1].cur=p[i].cur;
    p[i].cur=-1;
}


void ShowSList(StaticList &p){
    int i = p[0].cur;  // 从链表头开始
    while(i != -1){
        printf("%c-->", p[i].data);
        i = p[i].cur;  // 移动到下一个节点
    }
}
 //静态链表
    StaticList SL;
    InitSList(SL);
    for(int i=0; i<8; ++i)
    {

        Insert(SL,'A'+i);
    }
    ShowSList(SL);

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值