别看我只是一只羊


私信TA

用户名:bkwzsyzy

访问量:4410

签 名:

等  级
排  名 2371
经  验 2339
参赛次数 1
文章发表 23
年  龄 0
在职情况 学生
学  校
专  业

  自我简介:


  1. 动态链表:链表通过使用指针类型实现,链表中结点空间的分配回收由系统函数malloc和free实现

  2. 静态单链表:

          ① 在一些高级语言中并没有指针类型,但又想要采用链表作存储结构,即采用顺序结构数组模拟链表

          ② 则应在数组中设置游标模拟指针,再编写数组的分配回收过程。

  3. 游标模拟实现链表:

         #define M 10;     //链表最大长度,结点空间存储池

         typedef struct {

            int data;       //结点数据信息

            int cursor;    //(游标,非指针!!)存放后继结点在数组的位置—数组下标值

        }Cop,statlist[M];

  4. statlist[0]---头节点;

    statlist[数组末尾].cursor==-1,——表示静态单链表结束;


例子及问题:

      删除第八个元素h,即statlist[6].cursor=statlist[7].cursor啊,

      问题:statlist[7]未释放,仍占据数组空间

      出现“假满”现象,有空间,但无法使用!!!

解决方法:将未释放结点空间通过游标链成空闲结点链表,即存在两个链表。静态单链表和空闲节点链表


静态链表中,除了数据本身通过游标组成链表外,还需要有一条连接各个空闲位置的链表,称为备用链表。

 作用:回收数组中未使用或者之前使用过(现在不用)的存储空间,留待后期使用。

           即静态链表使用数组申请的物理空间中,存在两个链表,一条连接数据,另一条连接数组未使用的空间。

备用链表的好处是,可以清楚地知道数组中是否有空闲位置,以便数据链表添加新数据时使用。


静态单链表的初始化:

    void initial(statlist s,int *a){

        int k;

        s[0].cursor=-1;       //s[0]相当于头结点,等于-1代表指向为空

        for(innt k=1;k<M-1;k++)

            s[k].cursor=k+1;        //连链

            s[M-1].cursor=-1;     //链尾

            *a=1;                    //备用链表头指针初值,指向空闲结点静态链表中第一个结点

}


空闲单链表的分配结点空间:

    int getk(statlist s,int *a){

        int i;

        i=*a;

        *a=s[*a].cursor;     //从备用表摘下结点空间,分配给待插入静态链表中的元素

        return i;

    }

空闲结点的回收:

    void freek(statlist s,int *a,int k){

        s[k].cursor=*av;       //从备用链表s中回收序号为k的结点,a为备用链表的头指针

        *av=k;

}


问题!!!!!初始化中的s是静态单链表??分配回收中s是备用链表??




 

0.0分

13 人评分

  评论区

  • «
  • »