静态链表

静态链表

一明确概念:

1通常把未使用的数组元素(即未存放数据的节点)称为备用链表,如下标为5,6的节点。

2/*线性表的静态链表存储结构*/

#defineMAXSIZE 1000

typedefstruct

{

ElemTypedata;  // 数据

intcur;        // 游标(Cursor

}StaticLinkList[MAXSIZE];

二 核心在于四点(红色部分)

1     我们对数组的第一个和最后一个元素做特殊处理,它们的data不存放数据。


(1)数组的第一个元素(即下标为0的那个元素)的cur存放备用链表的第一个结点的下标。

(2)数组的最后一个元素(即下标为MAXSIZE-1的元素)的cur存放第一个有数据的元素的下标(相当于单链表中的头结点作用)。

(3) /*对静态链表进行初始化相当于初始化数组*/

Status InitList(StaticLinkList space)

{

      int i;

      for( i=0; i <MAXSIZE-1; i++ )

           space[i].cur = i +1;

//数组的第一个元素(即下标为0的元素)的cur存放备用链表的第一个结点的下标。

      space[MAXSIZE-1].cur =0;

//数组的最后一个元素(即下标为MAXSIZE-1的元素)的cur存放第一个有数据的元素的下标。

      return OK;

}

2 插入操作(核心在于两点)

 

 

例如想要把B插在A的后面

1)第一步需要修改A的游标,使A的游标指向B(即把B的下标赋值给A的游标)。

(2)第二步需要修改B的游标,使B的游标指向C(即把C的下标赋值给B的游标)。

(3)/*获得备用链表的第一个结点的下标(即下标5)*/

intMalloc_SLL(StaticLinkList space)

{

int i =space[0].cur;

// space[0].cur存放备用链表的第一个结点的下标。

if( space[0].cur)

space[0].cur =space[i].cur;

 // 获得备用链表的第一个结点的下标之后,这个节点将会被使用,故它的后一个节点(即下标为6的节点)将成为备用链表的第一个结点。

return i;

}

(4)/* 在静态链表L中第i个元素之前插入新的数据元素e(即在C前插入B) */

StatusListInsert( StaticLinkList L, int i, ElemType e )

{

    int j, k, l;

    k = MAX_SIZE - 1;    // 数组的最后一个元素

    if( i<1 || i>ListLength(L)+1 )

    {

        return ERROR;

    }

j = Malloc_SLL(L);   

 //获得备用链表的第一个结点的下标(即下标为5,即将存放B的元素)

    if( j )

    {

        L[j].data = e;

        for( l=1; l <= i-1; l++ )

        {

            k = L[k].cur;         //得到A的下标

        }

        L[j].cur = L[k].cur;        //L[k].cur是A的游标,也是C的下标

//把A的游标赋值给B的游标等同于把C的下标赋值给B的游标(即B指向C)

        L[k].cur = j;

//把B的下标赋值给A的游标(即A指向B)

        return OK;

    }

    return ERROR;

}                                                                                                

                                                                                                     

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值