动态链表:链表通过使用指针类型实现,链表中结点空间的分配回收由系统函数malloc和free实现
静态单链表:
① 在一些高级语言中并没有指针类型,但又想要采用链表作存储结构,即采用顺序结构数组模拟链表
② 则应在数组中设置游标模拟指针,再编写数组的分配回收过程。
游标模拟实现链表:
#define M 10; //链表最大长度,结点空间存储池
typedef struct {
int data; //结点数据信息
int cursor; //(游标,非指针!!)存放后继结点在数组的位置—数组下标值
}Cop,statlist[M];
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 人评分
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:504 |
幸运数 (C++代码)浏览:1309 |
A+B for Input-Output Practice (V) (C语言代码)浏览:497 |
蚂蚁感冒 (C语言代码)浏览:816 |
IP判断 (C语言代码)浏览:592 |
判定字符位置 (C语言代码)浏览:849 |
C语言程序设计教程(第三版)课后习题8.8 (C语言代码)浏览:751 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:522 |
字符串的修改 (C语言代码)浏览:1206 |
C语言训练-求素数问题 (C语言代码)浏览:630 |