📄 zhucunkongjiandefenpeiyuhuishou.cpp
字号:
#include <stdio.h>
#include <stdlib.h>
#include "conio.h"
#include <cstring>
#define creat(type) (type*)malloc(sizeof(type))
#define NULL 0
struct chain
{
int prestate;
int presize;
struct chain *pre;
int size;
int state;
int job;
int pos;
int nestate;
int nesize;
struct chain *next;
}*head=NULL,*back=NULL,*p,*q;
void sort(int JOB)
{
int n=0;
if(head==NULL)
{
if(p->size<640)
{
head=p;
head->next=back;
head->presize=640-p->size;
head->prestate=0;
head->pre=back;
head->job=1;
head->nestate=0;
head->nesize=640-p->size;
head->size=p->size;
head->pos=0;
head->state=1;
back->presize=p->size;
back->pre=head;
back->prestate=1;
back->size=640-p->size;
back->pos=p->size;
back->state=0;
back->job=0;
back->nesize=head->size;
back->next=head;
back->nestate=1;
}
else
{
printf("\nnot enough room!\n");
}
}
else if (head->state==0)
{
if(p->size<head->size)
{
p->next=head->next;
p->nesize=head->nesize;
p->nestate=head->nestate;
p->next->pre=p;
head->nesize=head->size-p->size;
head->next=p;
head->presize=back->size;
head->prestate=back->state;
head->pre=back;
head->job=JOB;
head->nestate=0;
head->size=p->size;
head->pos=0;
head->state=1;
p->pre=head;
p->presize=head->size;
p->prestate=head->state;
p->pos=head->pos+head->size;
p->state=0;
p->job=JOB;
p->size=head->nesize;
p->next->presize=p->size;
p->next->prestate=p->state;
}
else if(p->size==head->size)
{
head->job=JOB;
head->size=p->size;
head->pos=0;
head->state=1;
}
}
else
{
q=head;
while(q->next!=head&&n==0)
{
if(q->nestate==0)
{
if(p->size<q->nesize)
{
p->next=q->next;
p->pre=q;
p->presize=q->size;
p->prestate=q->state;
p->pos=q->pos+q->size;
p->state=1;
p->job=JOB;
p->nesize=q->nesize-p->size;
p->nestate=0; //p的设置
q->next->pre=p;
q->next->presize=p->size;
q->next->prestate=p->state;
q->next->size=q->nesize-p->size;
q->next->pos=p->pos+p->size;
q->next->state=0; //q的next的设置
q->next=p;
q->nesize=p->size;
q->nestate=1; //q的设置
n=1;
}
else if (p->size==q->nesize)
{
p->next=q->next->next;
p->pre=q;
p->presize=q->size;
p->prestate=q->state;
p->pos=q->pos+q->size;
p->state=1;
p->job=JOB;
p->nesize=q->next->nesize;
p->nestate=q->next->nestate; //p的设置
q->next=p;
q->nesize=p->size;
q->nestate=1; //q的设置
n=1;
}
}
q=q->next;
}
if (n==0)
{
printf("\nnot enough room!\n\n");
}
}
}
void jinchou()
{
int n=0;
chain *qr=head;
chain *qp=NULL;
while(qr->next!=head)
{
while(qr->state==0&&n==0)
{
if(qr->nestate==0&&qr->next!=back)
{
qr->size=qr->size+qr->next->size;
qr->nesize=qr->next->nesize;
qr->nestate=qr->next->nestate;
qp=qr->next;
qr->next=qr->next->next;
qr->next->pre=qr;
qr->next->prestate=qr->state;
qr->next->presize=qr->size;
free(qp);
}
else
{
n=1;
}
}
qr->pre->nesize=qr->size;
qr=qr->next;
}
}
void display(chain *q)
{
int i=1;
printf("序号 \t 作业 \t 分区大小 \t 起始地址 \t 状态 \n");
while(q!=back)
{
if(q->state==1)
printf("%d \t %d \t %d \t\t %d \t\t %d\n",i,q->job,q->size,q->pos,q->state);
else
printf("%d \t 空 \t %d \t\t %d \t\t %d\n",i,q->size,q->pos,q->state);
i++;
q=q->next;
}
if(q==back)
{
if(q->state==1)
printf("%d \t %d \t %d \t\t %d \t\t %d\n",i,q->job,q->size,q->pos,q->state);
else
printf("%d \t 空 \t %d \t\t %d \t\t %d\n",i,q->size,q->pos,q->state);
}
}
void distribute()
{
int n=0;
static int JOB=1;
printf("\n请你申请一个主存空间(k):");
scanf("%d",&n);
p=creat(chain);
p->size=n;
p->job=JOB;
p->state=1;
sort(JOB);
JOB++;
q=head;
display(q);
}
void release()
{
int n=0;
int sign=0;
int a=0;
int si=0;
int po=0;
chain *qr=NULL;
chain *qp=NULL;
printf("\nwhat job do you want to release?: ");
scanf("%d",&n);
q=head;
if (q==NULL)
{
printf("\n***there isn't any job here.***\n\n");
}
else
{
qr=q->next;
qp=q->pre;
si=q->size;
po=q->pos; //保留现场
while(q->next!=head&&a==0)
{
if (n==head->job)
{
free(head);
head=creat(chain);
head->next=qr;
head->presize=back->size;
head->prestate=back->state;
head->pre=back;
head->nestate=qr->state;
head->job=0;
head->nesize=qr->size;
head->size=si;
head->pos=0;
head->state=0;
back->nestate=0;
back->nesize=head->size;
back->next=head;
sign=1;
a=1;
}
else if(n==q->job)
{
free(q);
q=creat(chain);
q->next=qr;
q->presize=qp->size;
q->prestate=qp->state;
q->pre=qp;
q->job=0;
q->nestate=qr->state;
q->nesize=qr->size;
q->size=si;
q->pos=po;
q->state=0;
qp->nestate=0;
qp->nesize=q->size;
qp->next=q;
sign=1;
a=1;
}
q=q->next;
qp=q->pre;
qr=q->next;
si=q->size;
po=q->pos;
}
if(sign==0)
{
printf("\n*****there isn't the job which you want here.*****\n\n");
}
jinchou();
printf("\n");
display(head);
}
}
void main()
{
int num=0,n=0;
int c=0;
int JOB=1;
printf("序号 \t 作业 \t 分区大小 \t 起始地址 \t 状态 \n");
printf("1 \t 空\t 640K \t\t 0 \t\t 空表目 \n");
printf("\nwant to control? 1.yes 2.no ");
scanf("%d",&c);
back=creat(chain);
while(c==1)
{
printf("\nwhat do want to do: 1.distribute 2.release ");
scanf("%d",&num);
if (num==1)
{
distribute();
}
else if(num==2)
{
release();
}
else
{
printf("\nerror!please try again!\n");
}
printf("\nwant to control? 1.yes 2.no ");
scanf("%d",&c);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -