332 lines
5.7 KiB
C++
332 lines
5.7 KiB
C++
|
#define _CRT_SECURE_NO_WARNINGS 1
|
|||
|
|
|||
|
#include<stdio.h>
|
|||
|
#include<stdlib.h>
|
|||
|
|
|||
|
enum STATE
|
|||
|
{
|
|||
|
Free,
|
|||
|
Busy
|
|||
|
};
|
|||
|
|
|||
|
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 = 1000; // <20>ڴ<EFBFBD><DAB4><EFBFBD>ʼ<EFBFBD><CABC>С
|
|||
|
fir->state = Free;
|
|||
|
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 == Free && 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 = Busy;
|
|||
|
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 = Free;
|
|||
|
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 = Busy;
|
|||
|
p->taskId = taskId;
|
|||
|
}
|
|||
|
printf("<EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD><EFBFBD><EFBFBD>\n");
|
|||
|
return 1;
|
|||
|
}
|
|||
|
p = p->nxt;
|
|||
|
}
|
|||
|
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><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD>㷨
|
|||
|
int bestFit(int taskId, int size)
|
|||
|
{
|
|||
|
subAreaNode *tar = NULL;
|
|||
|
int tarSize = 1000 + 1;
|
|||
|
subAreaNode *p = subHead.nxt;
|
|||
|
while (p != NULL)
|
|||
|
{
|
|||
|
// Ѱ<><D1B0><EFBFBD><EFBFBD><EFBFBD>ѿ<EFBFBD><D1BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
if (p->state == Free && p->size >= size && p->size < tarSize) {
|
|||
|
tar = p;
|
|||
|
tarSize = p->size;
|
|||
|
}
|
|||
|
p = p->nxt;
|
|||
|
}
|
|||
|
if (tar != NULL) {
|
|||
|
// <20>ҵ<EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF>з<EFBFBD><D0B7><EFBFBD>
|
|||
|
if (tar->size - size <= 10)
|
|||
|
{
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
tar->state = Busy;
|
|||
|
tar->taskId = taskId;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>СΪsize<7A><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
subAreaNode *node = (subAreaNode *)malloc(sizeof(subAreaNode));
|
|||
|
node->addr = tar->addr + size;
|
|||
|
node->size = tar->size - size;
|
|||
|
node->state = Free;
|
|||
|
node->taskId = -1;
|
|||
|
// <20>ķ<DEB8><C4B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>ָ<EFBFBD><D6B8>
|
|||
|
node->pre = tar;
|
|||
|
node->nxt = tar->nxt;
|
|||
|
if (tar->nxt != NULL)
|
|||
|
{
|
|||
|
tar->nxt->pre = node;
|
|||
|
}
|
|||
|
tar->nxt = node;
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
tar->size = size;
|
|||
|
tar->state = Busy;
|
|||
|
tar->taskId = taskId;
|
|||
|
}
|
|||
|
printf("<EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD><EFBFBD><EFBFBD>\n");
|
|||
|
return 1;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
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;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
int freeSubArea(int taskId) // <20><><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>
|
|||
|
{
|
|||
|
int flag = 0;
|
|||
|
subAreaNode *p = subHead.nxt, *pp;
|
|||
|
while (p != NULL)
|
|||
|
{
|
|||
|
if (p->state == Busy && p->taskId == taskId)
|
|||
|
{
|
|||
|
flag = 1;
|
|||
|
if ((p->pre != &subHead && p->pre->state == Free)
|
|||
|
&& (p->nxt != NULL && p->nxt->state == Free))
|
|||
|
{
|
|||
|
// <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 == Busy)
|
|||
|
&& (p->nxt != NULL && p->nxt->state == Free))
|
|||
|
{
|
|||
|
// <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 = Free;
|
|||
|
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 == Free)
|
|||
|
&& (p->nxt == NULL || p->nxt->state == Busy))
|
|||
|
{
|
|||
|
// <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 = Free;
|
|||
|
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("*********************************************\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("**");
|
|||
|
printf(" %3d k |", p->addr);
|
|||
|
printf(" %3d k |", p->size);
|
|||
|
printf(" %s |", p->state == Free ? "Free" : "Busy");
|
|||
|
if (p->taskId > 0)
|
|||
|
{
|
|||
|
printf(" %2d ", p->taskId);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
printf(" ");
|
|||
|
}
|
|||
|
printf("**\n");
|
|||
|
p = p->nxt;
|
|||
|
}
|
|||
|
printf("*********************************************\n");
|
|||
|
}
|
|||
|
|
|||
|
int main()
|
|||
|
{
|
|||
|
int option, ope, taskId, size;
|
|||
|
// <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD>з<EFBFBD><D0B7><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
intSubArea();
|
|||
|
// ѡ<><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>㷨
|
|||
|
while (1)
|
|||
|
{
|
|||
|
printf("\n\n");
|
|||
|
printf("\t****************<2A><>ѡ<EFBFBD><D1A1>Ҫģ<D2AA><C4A3><EFBFBD>ķ<EFBFBD><C4B7><EFBFBD><EFBFBD>㷨******************\n");
|
|||
|
printf("\n\n");
|
|||
|
printf("\t \t 0 <20>״<EFBFBD><D7B4><EFBFBD>Ӧ<EFBFBD>㷨 \n");
|
|||
|
printf("\n\n");
|
|||
|
printf("\t \t 1 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD>㷨 \n");
|
|||
|
printf("\n\n");
|
|||
|
printf("\t\t\t\t<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>:");
|
|||
|
scanf("%d", &option);
|
|||
|
if (option == 0)
|
|||
|
{
|
|||
|
printf("<EFBFBD><EFBFBD>ѡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״<EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD>㷨<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>㷨<EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD>\n");
|
|||
|
break;
|
|||
|
}
|
|||
|
else if (option == 1)
|
|||
|
{
|
|||
|
printf("<EFBFBD><EFBFBD>ѡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD>㷨<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>㷨<EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD>\n");
|
|||
|
break;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
printf("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0/1\n\n");
|
|||
|
}
|
|||
|
}
|
|||
|
// ģ<>̬<E2B6AF><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>㷨
|
|||
|
while (1)
|
|||
|
{
|
|||
|
printf("\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><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>㷨
|
|||
|
if (option == 0)
|
|||
|
{
|
|||
|
firstFit(taskId, size);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
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;
|
|||
|
}
|
|||
|
|
|||
|
|