#include<stdio.h>
#include<conio.h>
#include<string.h>
#define MAX 12
struct partition{
char pn[10];
int begin;
int size;
int end;
char status;
};
typedef struct partition PART;
PART Total[MAX] ;
PART userjob ;
void init(){
strcpy(Total[0].pn,"No.1");
Total[0].begin=0;
Total[0].size=100;
Total[0].end=100;
Total[0].status='u';
}
void input(int num){
int i=0;
for(i=0;i<num;i++){
//作业名
printf("作业名:");
scanf("%s" ,&Total[i+1].pn);
//开始内存大小
printf("内存大小:");
scanf("%d",&Total[i+1].size);
//作业状态
Total[i+1].status = 'f';
//作业开始大小
Total[i+1].begin=Total[i].end;
//作业结束大小
Total[i+1].end=Total[i+1].begin+Total[i+1].size;
}
}
void output(int num){
int i=0;
printf("内存名\t开始\t大小\t结束\t状态\n");
for(i=0;i<MAX;i++)
{
if(Total[i].size!=0){
printf("%s \t %d \t %d \t %d \t %c \n" ,Total[i].pn,Total[i].begin,Total[i].size,Total[i].end,Total[i].status);
}
}
}
void inputjob(){
printf("作业名:");
scanf("%s" ,&userjob.pn);
//开始内存大小
printf("内存大小:");
scanf("%d",&userjob.size);
//作业状态
userjob.status='u';
//作业开始大小
userjob.begin=0;
//作业结束大小
userjob.end=0;
}
//首次适应算法
int firstadapt(int num){
int i=0;
for(i=0;i<=num;i++){
if(Total[i].status=='f'){
if(Total[i].size==userjob.size){
strcpy(Total[i].pn,userjob.pn);
Total[i].status='u';
printf("%d\n",userjob.size);
output(num);
return i;
}
else if(Total[i].size>userjob.size){
strcpy(Total[num+1].pn,Total[i].pn);
Total[num+1].size=Total[i].size-userjob.size;
strcpy(Total[i].pn,userjob.pn);
Total[i].end=Total[i].begin+userjob.size;
Total[i].size=userjob.size;
Total[i].status='u';
Total[num+1].begin=Total[i].end;
Total[num+1].end=Total[num+1].begin=+Total[num+1].size;
Total[num+1].status='f';
output(num);
return i;
}
else
break;
}
}
return 0;
}
//循环首次适应算法
void infofirstadapt(int num){
int i,j=0;
int now = firstadapt(num);
int flag = Total[now].size;
for(i=0;i<=num;i++){
if(Total[i].status=='f'&&Total[i].size>=userjob.size){
printf("%d\n",flag);
for(j=i+1;j<=num;j++){
if(Total[j].status=='f'&&Total[j].size>=userjob.size&&Total[j].size>flag){
flag=Total[j].size;
now=j;
}
}
break;
}
}
strcpy(Total[now].pn,userjob.pn);
Total[now].status='u';
printf("%d\n",userjob.size);
Total[now].end=Total[now].begin+userjob.size;
Total[now].size=userjob.size;
output(num);
}
//最坏适应算法
void badlyfit(int num){
int i,j=0;
int flag;
int now;
for(i=0;i<=num;i++){
if(Total[i].status=='f'&&Total[i].size>=userjob.size){
now=i;
flag=Total[i].size;
printf("%d\n",flag);
for(j=i+1;j<=num;j++){
if(Total[j].status=='f'&&Total[j].size>=userjob.size&&Total[j].size>flag){
flag=Total[j].size;
now=j;
}
}
break;
}
}
strcpy(Total[now].pn,userjob.pn);
Total[now].status='u';
printf("%d\n",userjob.size);
Total[now].end=Total[now].begin+userjob.size;
Total[now].size=userjob.size;
output(num);
}
void selecttypr(int select,int num){
switch(select){
case 1 :
printf("首次适应算法\n");
firstadapt(num);
break;
case 2 :
printf("循环首次适应算法\n");
infofirstadapt(num);
break;
case 3 :
printf("最佳适应算法\n");
break;
case 4 :
printf("最坏适应算法\n");
badlyfit(num);
break;
default :
printf("输入错误");
break;
}
}
//回收内存
void test(){
}
void main(){
int num;
int select;
printf("初始化,设内存的总量为512k\n");
printf("系统从低地址开始分配,占用100k\n");
init();
// printf("*********************************");
// printf("1、插入内存 2、回收内存");
printf("*********************************");
printf("\n\n\n");
printf("输入内存空闲块:");
scanf("%d",&num);
input(num);
printf("*********************************");
printf("\n\n\n");
output(num);
printf("*********************************");
printf("\n\n\n");
printf("用户输入作业:\n");
inputjob();
while(1){
printf("*********************************");
printf("\n\n\n");
printf("用户选择分配算法\n");
printf("\t\t 1.首次适应算法\n");
printf("\t\t 2.循环首次适应算法\n");
printf("\t\t 3.最佳适应算法\n");
printf("\t\t 4.最坏适应算法\n");
scanf("%d",&select);
selecttypr(select,num);
}
}