first commit
This commit is contained in:
278
计算机组成原理实验代码/First_Fit_2.cpp
Normal file
278
计算机组成原理实验代码/First_Fit_2.cpp
Normal file
@@ -0,0 +1,278 @@
|
||||
#include<stdio.h>
|
||||
#include<stdlib.h>
|
||||
|
||||
enum STATE {
|
||||
F, W
|
||||
};
|
||||
|
||||
struct subAreaNode {
|
||||
int addr; // <20><>ʼ<EFBFBD><CABC>ַ
|
||||
int size; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С
|
||||
int taskId; // <20><>ҵ<EFBFBD><D2B5>
|
||||
STATE state; // <20><><EFBFBD><EFBFBD>״̬
|
||||
subAreaNode *pre; // <20><><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0>ָ<EFBFBD><D6B8>
|
||||
subAreaNode *nxt; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
|
||||
} subHead;
|
||||
|
||||
|
||||
// <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD>з<EFBFBD><D0B7><EFBFBD><EFBFBD><EFBFBD>
|
||||
void intSubArea() {
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>
|
||||
subAreaNode *fir = (subAreaNode *)malloc(sizeof(subAreaNode));
|
||||
// <20><><EFBFBD><EFBFBD><D7B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
|
||||
fir->addr = 0;
|
||||
fir->size = 95; // <20>ڴ<EFBFBD><DAB4><EFBFBD>ʼ<EFBFBD><CABC>С
|
||||
fir->state = F;
|
||||
fir->taskId = -1;
|
||||
fir->pre = &subHead;
|
||||
fir->nxt = NULL;
|
||||
// <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD>Ϣ
|
||||
subHead.pre = NULL;
|
||||
subHead.nxt = fir;
|
||||
}
|
||||
|
||||
//// <20>״<EFBFBD><D7B4><EFBFBD>Ӧ<EFBFBD>㷨
|
||||
//int firstFit(int taskId, int size)
|
||||
//{
|
||||
//subAreaNode *p = subHead.nxt;
|
||||
//while (p != NULL)
|
||||
//{
|
||||
//if (p->state == F && p->size >= size)
|
||||
//{
|
||||
//// <20>ҵ<EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF>з<EFBFBD><D0B7><EFBFBD>
|
||||
//if (p->size - size <= 10)
|
||||
//{
|
||||
//// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
//p->state = W;
|
||||
//p->taskId = taskId;
|
||||
//}
|
||||
//else {
|
||||
//// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>СΪsize<7A><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
//subAreaNode *node = (subAreaNode *)malloc(sizeof(subAreaNode));
|
||||
//node->addr = p->addr + size;
|
||||
//node->size = p->size - size;
|
||||
//node->state = F;
|
||||
//node->taskId = -1;
|
||||
//// <20>ķ<DEB8><C4B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>ָ<EFBFBD><D6B8>
|
||||
//node->pre = p;
|
||||
//node->nxt = p->nxt;
|
||||
//if (p->nxt != NULL)
|
||||
//{
|
||||
//p->nxt->pre = node;
|
||||
//}
|
||||
//p->nxt = node;
|
||||
//// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
//p->size = size;
|
||||
//p->state = W;
|
||||
//p->taskId = taskId;
|
||||
//}
|
||||
//printf("<22>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD><C9B9><EFBFBD>\n");
|
||||
//return 1;
|
||||
//}
|
||||
//p = p->nxt;
|
||||
//}
|
||||
//printf("<22>Ҳ<EFBFBD><D2B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>...\n");
|
||||
//return 0;
|
||||
//}
|
||||
|
||||
|
||||
//struct subAreaNode *node
|
||||
|
||||
void BestFit(int taskId, int size) { //<2F><EFBFBD><EEBBB5>Ӧ
|
||||
//<2F><><EFBFBD>ѿ<EFBFBD>ָ<EFBFBD><D6B8>
|
||||
struct subAreaNode *q = NULL;
|
||||
subAreaNode *node = subHead.nxt;
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD><D2B5><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF>п<EFBFBD>
|
||||
while (node != NULL) {
|
||||
if (node->state == F && node->size >= size) {
|
||||
q = node;
|
||||
break;
|
||||
}
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>˵<EFBFBD><CBB5>û<EFBFBD>п<EFBFBD><D0BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Է<EFBFBD><D4B7><EFBFBD>
|
||||
if (node->nxt == NULL) {
|
||||
printf("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD>û<EFBFBD><EFBFBD><EFBFBD>㹻<EFBFBD>Ŀռ䣡\n");
|
||||
break;
|
||||
} else {
|
||||
node = node->nxt;
|
||||
}
|
||||
|
||||
}
|
||||
//<2F><><EFBFBD><EFBFBD>Ѱ<EFBFBD><D1B0><EFBFBD><EFBFBD><EFBFBD>ѵĿ<D1B5><C4BF>п<EFBFBD>
|
||||
while (node != NULL) {
|
||||
if (node->state == F && node->size >= size && node->size < q->size) { //<2F><><EFBFBD>еĿռ<C4BF>
|
||||
q = node;
|
||||
}
|
||||
node = node->nxt;
|
||||
}
|
||||
if (q->size > size) { //<2F><><EFBFBD>ѿ<EFBFBD><D1BF>п<EFBFBD><D0BF>Ĵ<EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʣ<EFBFBD><CAA3><EFBFBD>Ŀռ<C4BF>
|
||||
struct subAreaNode *p = (struct subAreaNode*)malloc(sizeof(struct subAreaNode));
|
||||
p->addr = q->addr + size;
|
||||
p->size = q->size - size;
|
||||
p->state = F;
|
||||
p->taskId = -1;
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD>Ŀռ<C4BF>
|
||||
q->taskId = taskId;
|
||||
q->size = size;
|
||||
q->state = W;
|
||||
//<2F>ı<EFBFBD><C4B1>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
p->nxt = q->nxt;
|
||||
q->nxt = p;
|
||||
} else if (q->size == size) { //<2F><><EFBFBD>ѿ<EFBFBD><D1BF>п<EFBFBD><D0BF>ռ<EFBFBD><D5BC><EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
q->taskId = taskId;
|
||||
q->size = size;
|
||||
q->state = W;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
int freeSubArea(int taskId) { // <20><><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>
|
||||
int flag = 0;
|
||||
subAreaNode *p = subHead.nxt, *pp;
|
||||
while (p != NULL) {
|
||||
if (p->state == W && p->taskId == taskId) {
|
||||
flag = 1;
|
||||
if ((p->pre != &subHead && p->pre->state == F)
|
||||
&& (p->nxt != NULL && p->nxt->state == F)) {
|
||||
// <20><><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD>ϲ<EFBFBD><CFB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// <20>Ⱥϲ<C8BA><CFB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
pp = p;
|
||||
p = p->pre;
|
||||
p->size += pp->size;
|
||||
p->nxt = pp->nxt;
|
||||
pp->nxt->pre = p;
|
||||
free(pp);
|
||||
// <20><><EFBFBD>ϲ<EFBFBD><CFB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
pp = p->nxt;
|
||||
p->size += pp->size;
|
||||
p->nxt = pp->nxt;
|
||||
if (pp->nxt != NULL) {
|
||||
pp->nxt->pre = p;
|
||||
}
|
||||
free(pp);
|
||||
} else if ((p->pre == &subHead || p->pre->state == W)
|
||||
&& (p->nxt != NULL && p->nxt->state == F)) {
|
||||
// <20><><EFBFBD><EFBFBD>2<EFBFBD><32>ֻ<EFBFBD>ϲ<EFBFBD><CFB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ķ<EFBFBD><C4B7><EFBFBD>
|
||||
pp = p->nxt;
|
||||
p->size += pp->size;
|
||||
p->state = F;
|
||||
p->taskId = -1;
|
||||
p->nxt = pp->nxt;
|
||||
if (pp->nxt != NULL) {
|
||||
pp->nxt->pre = p;
|
||||
}
|
||||
free(pp);
|
||||
} else if ((p->pre != &subHead && p->pre->state == F)
|
||||
&& (p->nxt == NULL || p->nxt->state == W)) {
|
||||
// <20><><EFBFBD><EFBFBD>3<EFBFBD><33>ֻ<EFBFBD>ϲ<EFBFBD><CFB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ķ<EFBFBD><C4B7><EFBFBD>
|
||||
pp = p;
|
||||
p = p->pre;
|
||||
p->size += pp->size;
|
||||
p->nxt = pp->nxt;
|
||||
if (pp->nxt != NULL) {
|
||||
pp->nxt->pre = p;
|
||||
}
|
||||
free(pp);
|
||||
} else {
|
||||
// <20><><EFBFBD><EFBFBD>4<EFBFBD><34><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><C2B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>úϲ<C3BA>
|
||||
p->state = F;
|
||||
p->taskId = -1;
|
||||
}
|
||||
}
|
||||
p = p->nxt;
|
||||
}
|
||||
if (flag == 1) {
|
||||
// <20><><EFBFBD>ճɹ<D5B3>
|
||||
printf("<EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ճɹ<EFBFBD>...\n");
|
||||
return 1;
|
||||
} else {
|
||||
// <20>Ҳ<EFBFBD><D2B2><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>
|
||||
printf("<EFBFBD>Ҳ<EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><EFBFBD>...\n");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
// <20><>ʾ<EFBFBD><CABE><EFBFBD>з<EFBFBD><D0B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
void showSubArea() {
|
||||
printf("\n");
|
||||
printf(" <20><>ǰ<EFBFBD><C7B0><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>£<EFBFBD> \n");
|
||||
printf(" W:<3A><><EFBFBD><EFBFBD>״̬ F:<3A><><EFBFBD><EFBFBD>״̬ \n");
|
||||
printf("___________________________________________\n");
|
||||
printf("| <20><>ʼ<EFBFBD><CABC>ַ | <20>ռ<EFBFBD><D5BC><EFBFBD>С | <20><><EFBFBD><EFBFBD>״̬ | <20><>ҵ<EFBFBD><D2B5> |\n");
|
||||
subAreaNode *p = subHead.nxt;
|
||||
while (p != NULL) {
|
||||
printf("___________________________________________\n");
|
||||
|
||||
printf(" %3d k |", p->addr);
|
||||
printf(" %3d k |", p->size);
|
||||
printf(" %s |", p->state == F ? "F" : "W");
|
||||
if (p->taskId > 0) {
|
||||
printf(" %2d ", p->taskId);
|
||||
} else {
|
||||
printf(" ");
|
||||
}
|
||||
printf("\n");
|
||||
p = p->nxt;
|
||||
}
|
||||
printf("___________________________________________\n");
|
||||
}
|
||||
|
||||
int main() {
|
||||
int ope, taskId, size;
|
||||
char name;
|
||||
int ArriveTime;
|
||||
int ServerTime;
|
||||
// <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD>з<EFBFBD><D0B7><EFBFBD><EFBFBD><EFBFBD>
|
||||
intSubArea();
|
||||
|
||||
// ģ<>̬<E2B6AF><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>㷨
|
||||
while (1) {
|
||||
printf("Ĭ<EFBFBD><EFBFBD>FF(<28>״<EFBFBD><D7B4><EFBFBD>Ӧ<EFBFBD>㷨)\n");
|
||||
printf("_________________________________________\n");
|
||||
printf("| 1: <20><><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD> 2: <20><><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD> 0: <20>˳<EFBFBD> |\n");
|
||||
printf("|________________________________________|\n");
|
||||
scanf("%d", &ope);
|
||||
if (ope == 0) break;
|
||||
if (ope == 1) {
|
||||
// ģ<><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>
|
||||
printf("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD>ţ<EFBFBD> ");
|
||||
scanf("%d", &taskId);
|
||||
printf("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> ");
|
||||
scanf("%s", &name);
|
||||
printf("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>뵽<EFBFBD><EFBFBD>ʱ<EFBFBD>䣺 ");
|
||||
scanf("%d", &ArriveTime);
|
||||
printf("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>䣺 ");
|
||||
scanf("%d", &ServerTime);
|
||||
printf("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD>С(KB)<29><> ");
|
||||
scanf("%d", &size);
|
||||
if (size <= 0) {
|
||||
printf("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD>ֵ\n");
|
||||
continue;
|
||||
}
|
||||
// <20><><EFBFBD>÷<EFBFBD><C3B7><EFBFBD><EFBFBD>㷨
|
||||
|
||||
//firstFit(taskId, size);
|
||||
BestFit(taskId, size);
|
||||
|
||||
// <20><>ʾ<EFBFBD><CABE><EFBFBD>з<EFBFBD><D0B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
showSubArea();
|
||||
} else if (ope == 2) {
|
||||
// ģ<><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>
|
||||
printf("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD>ţ<EFBFBD> ");
|
||||
scanf("%d", &taskId);
|
||||
freeSubArea(taskId);
|
||||
// <20><>ʾ<EFBFBD><CABE><EFBFBD>з<EFBFBD><D0B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
showSubArea();
|
||||
} else {
|
||||
printf("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0/1/2\n");
|
||||
}
|
||||
}
|
||||
printf("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>㷨ģ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\n");
|
||||
system("pause");
|
||||
return 0;
|
||||
}
|
Reference in New Issue
Block a user