#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 128
#define e 1 //e
int entertime=0; //全局变量,用于表示进程进入的时间序列
int SIZE=0;
//--------------------------------------
typedef struct WORD
{//内存字类型
union
{
WORD *llink;
WORD *uplink;
}a;
int tag;
int size;
WORD *rlink;
}WORD,head,foot,*Space;
#define FootLoc(p) (p)+(p)->size-1
//-----------------------------------------
void Init(Space &pav)
{//初始化内存
Space p;
p=(WORD*)malloc((MAX+2)*sizeof(WORD));
p->tag=1; //设置低址边界,以防查找左右邻块时出错
pav=p+1;
pav->rlink=pav->a.llink=pav;
pav->tag=0;
pav->size=MAX;
p=FootLoc(pav);
p->a.uplink=pav;
p->tag=0;
(p+1)->tag=1; //设置高址边界,以防查找左右邻块时出错
printf("内存初始化成功!\n");
}
typedef struct
{
Space s; //占用块指针循环队列(初始化为空),配合全局变量number实现
int num; //进程编号
}Pro_Space;
Pro_Space v[MAX/e]={NULL}; //
int front=0; //记录队列首元素位置
int number=0; //全局变量,第number个进入内存的段
//-----------------------------------------
Space AllocBoundTag(Space &pav,int n)
{/* 若有不小于n的空闲块,则分配相应的存储块,并返回其首地址;否则返回NULL */
/* 若分配后可利用空间表不空,则pav指向表中刚分配过的结点的后继结点 */
Space p,f;
for(p=pav;p&&p->size<n&&p->rlink;p=p->rlink);
if(!p||p->size<n)
return NULL;
else
{
f=FootLoc(p);