.
typedef int Status;
typedef struct free_table//定义一个空闲区说明表结构 {
int num; //分区序号 long address; //起始地址 long length; //分区大小 int state; //分区状态 }ElemType;
typedef struct Node// 线性表的双向链表存储结构 {
ElemType data;
struct Node *prior; //前趋指针 struct Node *next; //后继指针 }Node,*LinkList;
LinkList first; //头结点 LinkList end; //尾结点
int flag;//记录要删除的分区序号
Status Initblock()//开创带头结点的内存空间链表 {
first=(LinkList)malloc(sizeof(Node)); end=(LinkList)malloc(sizeof(Node)); first->prior=NULL; first->next=end; end->prior=first; end->next=NULL; end->data.num=1; end->data.address=40; end->data.length=600; end->data.state=0; return OK; }
void sort()//分区序号重新排序 {
Node *p=first->next,*q; q=p->next;
for(;p!=NULL;p=p->next) {
for(q=p->next;q;q=q->next) {
精品
.
if(p->data.num>=q->data.num) {
q->data.num+=1; } } } }
//显示主存分配情况 void show()
{ int flag=0;//用来记录分区序号 Node *p=first; p->data.num=0; p->data.address=0; p->data.length=40; p->data.state=1; sort();
printf(\》主存空间分配情况《\\n\
printf(\ printf(\分区序号\\t起始地址\\t分区大小\\t分区状态\\n\\n\ while(p) {
printf(\ if(p->data.state==0) printf(\空闲\\n\\n\ else printf(\已分配\\n\\n\ p=p->next; }
printf(\ }
//首次适应算法
Status First_fit(int request) {
//为申请作业开辟新空间且初始化 Node *p=first->next;
LinkList temp=(LinkList)malloc(sizeof(Node)); temp->data.length=request; temp->data.state=1; p->data.num=1; while(p) {
if((p->data.state==0)&&(p->data.length==request)) {//有大小恰好合适的空闲块 p->data.state=1;
精品
.
return OK; break; }
else if((p->data.state==0) && (p->data.length>request)) {//有空闲块能满足需求且有剩余 temp->prior=p->prior; temp->next=p;
temp->data.address=p->data.address; temp->data.num=p->data.num; p->prior->next=temp; p->prior=temp;
p->data.address=temp->data.address+temp->data.length; p->data.length-=request; p->data.num+=1; return OK; break; }
p=p->next; }
return ERROR; }
//最佳适应算法
Status Best_fit(int request) {
int ch; //记录最小剩余空间 Node *p=first;
Node *q=NULL; //记录最佳插入位置
LinkList temp=(LinkList)malloc(sizeof(Node)); temp->data.length=request; temp->data.state=1; p->data.num=1;
while(p) //初始化最小空间和最佳位置 {
if((p->data.state==0) && (p->data.length>=request) ) {
if(q==NULL) { q=p;
ch=p->data.length-request; }
else if(q->data.length > p->data.length) { q=p;
精品
.
ch=p->data.length-request; } }
p=p->next; }
if(q==NULL) return ERROR;//没有找到空闲块 else if(q->data.length==request) {
q->data.state=1; return OK; } else {
temp->prior=q->prior; temp->next=q;
temp->data.address=q->data.address; temp->data.num=q->data.num; q->prior->next=temp; q->prior=temp;
q->data.address+=request; q->data.length=ch; q->data.num+=1; return OK; }
return OK; }
//最差适应算法
Status Worst_fit(int request) {
int ch; //记录最大剩余空间 Node *p=first->next;
Node *q=NULL; //记录最佳插入位置
LinkList temp=(LinkList)malloc(sizeof(Node)); temp->data.length=request; temp->data.state=1; p->data.num=1;
while(p) //初始化最大空间和最佳位置 {
if(p->data.state==0 && (p->data.length>=request) ) {
if(q==NULL) {
q=p;
精品