无用单元收集(算法8.3)

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;
            } //继续遍历表尾
        }
    }
}

找到一篇全部代码可以参考。

8.6 存储紧缩

内存紧缩(内存碎片化处理)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值