8.5 无用单元收集
严氏数据结构书中图8.11描述比较精简,我就没有看懂,找到一篇分析非常全的解释。
无用单元收集(垃圾回收机制)
大致思路
t=NULL;p=GL;finished=false;
while(!finished){
while(p->mark==0){//访问到原子结点
p->mark=1;
MarkHead(p);//若表头是未经遍历的非空子表,则修改指针记录路径,且p指向表头;否则p不变
}
q=p->p.pt;
if(q&&q->mark==0) MarkTail(p);//修改指针记录路径,且p指向表尾
else BackTrack(finished);//若从表尾回溯到第一个结点,则finished为true
}
具体实现
void MarkList(GList GL)
{
//遍历非空广义表GL(GL!=NULL& GL->mark=0)
GLNode *t = NULL, *p = GL, *q = NULL; //t指示p的母表
bool finished = false;
while (!finished)
{
while (p->mark == 0)
{
p->mark = 1;
//MarkHead(p)的细化
q = p->p.hp; //q指向*p的表头
if (q && q->mark == 0)
{
if (q->tag == 0)
q->mark = 1; //表头为原子结点,q指向*p的表尾
else
{ //否则继续遍历子表
p->p.ph = t;
p->tag = 0;
t = p;
p = q;
}
}
//MarkHead(p)的细化 结束
}
//以上完成对表头的标志
q = p->p.tp; //指向*p的表尾
if (q && q->mark == 0)
{ //q非空且是表头,则继续遍历表尾
p->p.pt = t;
t = p;
p = q;
}
else
{
//BackTrack(finished)的细化
while (t && t->tag == 1) //List,表结点,从表尾回溯
{
q = t;
t = q->p.tp;
q->p.tp = p;
p = q;
}
if (!t)
finished = true; //结束
else
{ //从表头回溯
q = t;
t = q->p.ho;
q->p.hp = p;
p = q;
p->tag = 1;
} //继续遍历表尾
}
}
}
找到一篇全部代码可以参考。