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.0分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论