文档介绍:第八章动态存储管理
typedef struct {
                  char *start;
                 int size;
              } fmblock; //空闲块类型
char *Malloc_Fdlf(int n)//遵循最后分配者最先释放规则的内存分配算法
{
  while(Gettop(S,b)&&<n)
  {
    Pop(S,b);
    Push(T,b); //从栈顶逐个取出空闲块进行比较
  }
  if(StackEmpty(S)) return NULL; //没有大小足够的空闲块
  Pop(S,b);
  -=n;
  if() Push(S,{+n,});//分割空闲块
  while(!StackEmpty(T))
  {
    Pop(T,a);
    Push(S,a);
  } //恢复原来次序
  return ;
}//Malloc_Fdlf
mem_init()//初始化过程
{
  ...
  InitStack(S);InitStack(T); //S和T的元素都是fmblock类型
  Push(S,{MemStart,MemLen}); //一开始,栈中只有一个内存整块
  ...
}//main
void Free_Fdlf(char *addr,int n)//与上一题对应的释放算法
{
  while(Gettop(S,b)&&<addr)
  {
    Pop(S,b);
    Push(T,b);
  } //在按地址排序的栈中找到合适的插入位置
  if(Gettop(T,b)&&(+==addr)) //可以与上邻块合并
  {
    Pop(T,b);
    addr=;n+=;
  }
  if(Gettop(S,b)&&(addr+n==)) //可以与下邻块合并
  {
    Pop(S,b);
    n+=;
  }
  Push(S,{addr,n}); //插入到空闲块栈中
  while(!StackEmpty(T))
  {
    Pop(T,b);
    Push(S,b);
  } //恢复原来次序
}//Free_Fdlf
void Free_BT(Space &pav,Space p)//在边界标识法的动态存储管理系统中回收空闲块p
{
  n=p->size;
  f=p+n-1; //f指向空闲块底部
  if((p-1)->tag&&(f+1)->tag) //回收块上下邻块均为占用块
  {
    p->tag=0;f->tag=0;
    f->uplink=p;
    if(!pav)
    {
      p->llink=p;
      p->rlink=p;
    }
    else