?? 周峰.cpp
字號:
#include<stdio.h>
#include<iostream>
using namespace std;
#include"stdlib.h"
typedef struct area{
int start;
int length;
int state;
struct area *next;
}Area,*pArea;
const int Max=255;
void PrintMemoryState(Area *);
void FirstFit(Area *);
void BestFit(Area *);
void WorstFit(Area *);
void MaxLength(Area *);
int main()
{
Area *work;
Area *p;
Area *p1;
Area *p2;
Area *p3;Area *p4;Area *p5;
int Choice;
//int start;
pArea head=(Area *)malloc(sizeof(Area));//分配頭指針
//extern void *malloc(unsigned int num_bytes)功能:分配長度為num_bytes字節的內存塊
work=(Area *)malloc(sizeof(Area));
head->start=0;
head->length=0;
head->state=1;
head->next=NULL;
//裝入系統
printf(".............正在載入系統中..............\n");
work->start=0;
work->length=1;
work->next=NULL;
work->state=1;
head->next=work;
p=(Area *)malloc(sizeof(Area));
p->start=1;
p->length=32;
// p->next=NULL;
p->state=-1;
work->next=p;
p1=(Area *)malloc(sizeof(Area));
p1->start=33;
p1->length=16;
// p1->next=NULL;
p1->state=-1;
p->next=p1;
p2=(Area *)malloc(sizeof(Area));
p2->start=49;
p2->length=8;
// p2->next=NULL;
p2->state=-1;
p1->next=p2;
p3=(Area *)malloc(sizeof(Area));
p3->start=57;
p3->length=4;
//p3->next=NULL;
p3->state=-1;
p2->next=p3;
p4=(Area *)malloc(sizeof(Area));
p4->start=61;
p4->length=64;
// p4->next=NULL;
p4->state=-1;
p3->next=p4;
p5=(Area *)malloc(sizeof(Area));
p5->start=125;
p5->length=Max-125;
p5->next=NULL;
p5->state=-1;
p4->next=p5;
PrintMemoryState(head);//輸出當前的內存使用狀況
//開始循環
while(1)
{
printf(" 1.最先適應法;2.最優適應法;3.最差適應法;0.退出程序\n");
printf("<CHOICE> #");
scanf("%d",&Choice);//輸入你所要的選項。為choice 的值
switch(Choice)
{
case 0:
printf("The System Is Shutdown... \n");
goto A;
case 1:
FirstFit(head);
PrintMemoryState(head);//最先適應法
continue;
case 2:
BestFit(head);
PrintMemoryState(head);//最優適應法
continue;
case 3:
WorstFit(head);
PrintMemoryState(head);//最差適應法
continue;
default:
printf("Please input a right number!\n");
break;
}
}
A: return 0;
}
void PrintMemoryState(Area *head)
{
int state=-1;
Area *temp=(Area *)malloc(sizeof(Area));
temp=head->next;
printf("\t起始地址\t內存長度\t內存狀態\n");
do
{
printf("\t%8d\t%8d\t%8d\n",temp->start,temp->length,temp->state);
temp=temp->next;
}while(temp/*->length+temp->start)*/!=NULL);
printf("\t%8d\t%8d\t%8d\n",Max,0,state);
return ;
}
void FirstFit(Area *head)//裝入作業,最先適應法
{
int flag=0;//int sum=0;
int lengthtemp;
int a[3];
Area *last=(Area *)malloc(sizeof(Area));
Area *Task=NULL;
Area *newFree=NULL;
cout<<"請分別輸入需要分配內存的3個作業內存長度:"<<endl;
for(int i=0;i<3;i++)
{
cin>>a[i];
}
for(i=0;i<3;)
{
int sum;int n=0;int b[10]={-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};
Task=head->next;
while(Task!=NULL)
{
if(Task->state==1)
{
Task=Task->next;
}
else
{
b[n]=Task->length;
Task=Task->next;
n++;
}
}
delete Task;//把各個length裝入數組B
sum=b[0];
for(int j=0;j<n;j++)
{
if(sum<b[j+1])
sum=b[j+1];
}//sum取B[n]中的最大值
if(a[i]>sum)
{
cout<<"a["<<i<<"] 作業過長,無法裝入 "<<endl;
goto B;
//exit(-1);
}
last=head->next;
while(last!=NULL)
{
if(last->state==1)
{
last=last->next;
continue;
}//首先判斷占用情況,如果被占用則查看下一個內存塊
else
{
if(last->length==a[i])
{
last->state=1;flag=1;
goto B;
}//等于的話直接裝入
if(last->length>a[i])
{
lengthtemp=last->length;
last->length=a[i];
last->state=1;
newFree=(Area *)malloc(sizeof(Area));
newFree->next=last->next;
newFree->start=last->start+last->length;
newFree->length=lengthtemp-last->length;
newFree->state=-1;
last->next=newFree;//成功插入newFree節點
flag=1;
goto B;
}
if(last->length<a[i])//如果內存長度小于所給作業要占用的內存長度,則查看下一個內存塊
{
last=last->next;
continue;
}
}//else結束
} //while 結束
B: i++;
}
if(flag==0)
{
printf("Cann't Load the Task! System will shutdown!\n");
exit(-1);
}
}
void WorstFit(Area *head)//裝入作業,最差適應法
{
int lengthtemp;
int a[3];
Area *last=NULL;
Area *newFree=NULL;
cout<<"請分別輸入需要分配內存的3個作業內存長度:"<<endl;
for(int i=0;i<3;i++)
{
cin>>a[i];
}
for(i=0;i<3;)
{
Area *Task=NULL;
last=head->next;
Task=last->next;
while(Task!=NULL)
{
if(Task->state==1)
Task=Task->next;
else
{
if(last->length<Task->length)
{
last=Task;
Task=Task->next;
}
else Task=Task->next;
}//last指向length最大的那塊
}
// int l=last->length;
// cout<<l<<" 周 ";
delete Task;
if(a[i]>last->length)
{
cout<<"a["<<i<<"] 作業過長,無法裝入 "<<endl;
goto C;
}
if(last->length==a[i])
{
last->state=1;
goto C;
}//等于的話直接裝入
if(last->length>a[i])
{
lengthtemp=last->length;
last->length=a[i];
last->state=1;
newFree=(Area *)malloc(sizeof(Area));
newFree->next=last->next;
newFree->start=last->start+last->length;
newFree->length=lengthtemp-last->length;
newFree->state=-1;
last->next=newFree;//成功插入newFree節點
goto C;
}
C: i++;
}
}
void BestFit(Area *head)//裝入作業,最優適應法
{
int flag=0;
int lengthtemp;
int a[3];
Area *last=(Area *)malloc(sizeof(Area));
Area *newFree=NULL;
Area *H=NULL;
cout<<"請分別輸入需要分配內存的3個作業內存長度:"<<endl;
for(int i=0;i<3;i++)
{
cin>>a[i];
}
for(i=0;i<3;)
{
int sum;int n=0;int b[10]={-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};
int d=0;
Area *Task=NULL;
Area *p=NULL;
last=head->next;
Task=last;
p=head->next;
H=head->next;
while(H!=NULL)
{
if(H->state==1)
{
H=H->next;
}
else
{
b[n]=H->length;
H=H->next;
n++;
}
}
delete H;//把各個length裝入數組B
sum=b[0];
for(int j=0;j<n;j++)
{
if(sum<b[j+1])
sum=b[j+1];
}//sum取B[n]中的最大值
if(a[i]>sum)
{
cout<<"a["<<i<<"] 作業過長,無法裝入 "<<endl;
goto C;
//exit(-1);
}
while(last!=NULL)
{
if(last->state==1)
last=last->next;
else
{
if(a[i]>last->length)
last=last->next;
else if(a[i]==last->length)
{
last->state=1;
goto C;
}
else if(a[i]<last->length)
{
Task=last;
if(d==0)
{
p=Task;
d++;
}
if(p->length>Task->length)
p=Task;
last=last->next;
}
}
}
lengthtemp=p->length;
p->length=a[i];
p->state=1;
newFree=(Area *)malloc(sizeof(Area));
newFree->next=p->next;
newFree->start=p->start+p->length;
newFree->length=lengthtemp-p->length;
newFree->state=-1;
p->next=newFree;//成功插入newFree節點
C: i++;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -