Ejemplo n.º 1
0
 void main()
 {
   Space pav,p; /* 空闲块指针 */
   Space v[MAX/e]={NULL}; /* 占用块指针数组(初始化为空) */
   int n;
   printf("结构体WORD为%d个字节\n",sizeof(WORD));
   p=(WORD*)malloc((MAX+2)*sizeof(WORD)); /* 申请大小为MAX*sizeof(WORD)个字节的空间 */
   p->tag=1; /* 设置低址边界,以防查找左右邻块时出错 */
   pav=p+1; /* 可利用空间表的表头 */
   pav->rlink=pav->a.llink=pav; /* 初始化可利用空间(一个整块) */
   pav->tag=0;
   pav->size=MAX;
   p=FootLoc(pav); /* p指向底部域 */
   p->a.uplink=pav;
   p->tag=0;
   (p+1)->tag=1; /* 设置高址边界,以防查找左右邻块时出错 */
   printf("初始化后,可利用空间表为:\n");
   Print(pav);
   n=300;
   v[0]=AllocBoundTag(&pav,n);
   printf("分配%u个存储空间后,可利用空间表为:\n",n);
   Print(pav);
   PrintUser(v);
   n=450;
   v[1]=AllocBoundTag(&pav,n);
   printf("分配%u个存储空间后,pav为:\n",n);
   Print(pav);
   PrintUser(v);
   n=300; /* 分配不成功 */
   v[2]=AllocBoundTag(&pav,n);
   printf("分配%u个存储空间后(不成功),pav为:\n",n);
   Print(pav);
   PrintUser(v);
   n=242; /* 分配整个块(250) */
   v[2]=AllocBoundTag(&pav,n);
   printf("分配%u个存储空间后(整块分配),pav为:\n",n);
   Print(pav);
   PrintUser(v);
   printf("回收v[0](%d)后(当pav空时回收),pav为:\n",v[0]->size);
   Reclaim(&pav,&v[0]); /* pav为空 */
   Print(pav);
   PrintUser(v);
   printf("1按回车键继续");
   getchar();
   printf("回收v[2](%d)后(左右邻区均为占用块),pav为:\n",v[2]->size);
   Reclaim(&pav,&v[2]); /* 左右邻区均为占用块 */
   Print(pav);
   PrintUser(v);
   n=270; /* 查找空间足够大的块 */
   v[0]=AllocBoundTag(&pav,n);
   printf("分配%u个存储空间后(查找空间足够大的块),pav为:\n",n);
   Print(pav);
   PrintUser(v);
   n=30; /* 在当前块上分配 */
   v[2]=AllocBoundTag(&pav,n);
   printf("分配%u个存储空间后(在当前块上分配),pav为:\n",n);
   Print(pav);
   PrintUser(v);
   printf("回收v[1](%d)后(右邻区为空闲块,左邻区为占用块),pav为:\n",v[1]->size);
   Reclaim(&pav,&v[1]); /* 右邻区为空闲块,左邻区为占用块 */
   Print(pav);
   PrintUser(v);
   printf("2按回车键继续");
   getchar();
   printf("回收v[0](%d)后(左邻区为空闲块,右邻区为占用块),pav为:\n",v[0]->size);
   Reclaim(&pav,&v[0]); /* 左邻区为空闲块,右邻区为占用块 */
   Print(pav);
   PrintUser(v);
   printf("回收v[2](%d)后(左右邻区均为空闲块),pav为:\n",v[2]->size);
   Reclaim(&pav,&v[2]); /* 左右邻区均为空闲块 */
   Print(pav);
   PrintUser(v);
 }
Ejemplo n.º 2
0
 void main()
 {
   Space pav,p; // 空闲块指针
   Space v[MAX/e]={NULL}; // 占用块指针数组(初始化为空)
   int n;
   printf("结构体WORD为%d个字节\n",sizeof(WORD));
   p=new WORD[MAX+2]; // 申请大小为MAX*sizeof(WORD)个字节的空间
   p->tag=1; // 设置低址边界,以防查找左右邻块时出错
   pav=p+1; // 可利用空间表的表头
   pav->rlink=pav->llink=pav; // 初始化可利用空间(一个整块)
   pav->tag=0;
   pav->size=MAX;
   p=FootLoc(pav); // p指向底部域
   p->uplink=pav;
   p->tag=0;
   (p+1)->tag=1; // 设置高址边界,以防查找左右邻块时出错
   printf("初始化后,可利用空间表为:\n");
   Print(pav);
   n=300;
   v[0]=AllocBoundTag(pav,n);
   printf("分配%u个存储空间后,可利用空间表为:\n",n);
   Print(pav);
   PrintUser(v);
   n=450;
   v[1]=AllocBoundTag(pav,n);
   printf("分配%u个存储空间后,pav为:\n",n);
   Print(pav);
   PrintUser(v);
   n=300; // 分配不成功
   v[2]=AllocBoundTag(pav,n);
   printf("分配%u个存储空间后(不成功),pav为:\n",n);
   Print(pav);
   PrintUser(v);
   n=242; // 分配整个块(250)
   v[2]=AllocBoundTag(pav,n);
   printf("分配%u个存储空间后(整块分配),pav为:\n",n);
   Print(pav);
   PrintUser(v);
   printf("回收v[0](%d)后(当pav空时回收),pav为:\n",v[0]->size);
   Reclaim(pav,v[0]); // pav为空
   Print(pav);
   PrintUser(v);
   printf("1按回车键继续");
   getchar();
   printf("回收v[2](%d)后(左右邻区均为占用块),pav为:\n",v[2]->size);
   Reclaim(pav,v[2]); // 左右邻区均为占用块
   Print(pav);
   PrintUser(v);
   n=270; // 查找空间足够大的块
   v[0]=AllocBoundTag(pav,n);
   printf("分配%u个存储空间后(查找空间足够大的块),pav为:\n",n);
   Print(pav);
   PrintUser(v);
   n=30; // 在当前块上分配
   v[2]=AllocBoundTag(pav,n);
   printf("分配%u个存储空间后(在当前块上分配),pav为:\n",n);
   Print(pav);
   PrintUser(v);
   printf("回收v[1](%d)后(右邻区为空闲块,左邻区为占用块),pav为:\n",v[1]->size);
   Reclaim(pav,v[1]); // 右邻区为空闲块,左邻区为占用块
   Print(pav);
   PrintUser(v);
   printf("2按回车键继续");
   getchar();
   printf("回收v[0](%d)后(左邻区为空闲块,右邻区为占用块),pav为:\n",v[0]->size);
   Reclaim(pav,v[0]); // 左邻区为空闲块,右邻区为占用块
   Print(pav);
   PrintUser(v);
   printf("回收v[2](%d)后(左右邻区均为空闲块),pav为:\n",v[2]->size);
   Reclaim(pav,v[2]); // 左右邻区均为空闲块
   Print(pav);
   PrintUser(v);
 }