📄 dycsize.cpp
字号:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
const TXMAX = 100;
const DXMAX = 100;
typedef struct {
char NAME[10]; //名称
int size; //所占空间大小
int Add; //开始地址
} FACT;
struct{
FACT fact;
}YIFEN[TXMAX]; //已分配区表
struct FREE_BOX {
int Add; //开始地址
int size; //分区大小
int state; //状态 1-未分配,0-空表目
}FreeBox[DXMAX]; //空闲区说明表
int TX; //已分配区表的下标
int DX; //空闲区说明表的下标
//分配空闲区
int FreeBoxServe(FACT fact, int DX0) {
int i;
fact.Add = FreeBox[DX0].Add;
if (fact.size == FreeBox[DX0].size) {
for (i = DX0; i < DXMAX - 1; i ++ ) {
FreeBox[i] = FreeBox[i + 1];
DX--;
}
} else {
FreeBox[DX0].Add = FreeBox[DX0].Add + fact.size;
FreeBox[DX0].size = FreeBox[DX0].size - fact.size;
}
return (fact.Add);
}
//注册已分配表
void YifenpeiServe(FACT fact, int add) {
if ((TX + 1) > (TXMAX - 1)) {
printf("添加作业失败!\n");
return;
}
strcpy(YIFEN[++TX].fact.NAME, fact.NAME);
YIFEN[TX].fact.size = fact.size;
YIFEN[TX].fact.Add = add;
printf(" NAME: %s, ADD: %d, SIZE: %dK\n", YIFEN[TX].fact.NAME, YIFEN[TX].fact.Add, YIFEN[TX].fact.size);
getch();
}
/*添加作业或进程*/
void addProcess() {
FACT _fact;
int DX0 = 0;
system("cls");
printf("作业名称:");
scanf("%s", _fact.NAME);
printf("占用空间(K):");
scanf("%d", &_fact.size);
//开始分配空间
while (DX0 <= DX) {
if (_fact.size < 10) {
printf("作业所需空间小于内存分割数!\n");
return;
} else if (_fact.size > FreeBox[DX0].size) {
DX0 ++;
} else break;
}
if (DX0 > DX) {
printf("剩余空闲分区容量过少无法分配!");
getch();
return;
}
YifenpeiServe(_fact, FreeBoxServe(_fact, DX0));
}
//重新整理空闲分配表
void TurnFreeBox(int DX0, int flag) {
int i = 0;
int L;
int S;
switch (flag) {
case 2:
if (DX0 == DX) {
break;
} else {
while (FreeBox[DX].Add > FreeBox[i].Add) {
i++;
}
DX0 = DX;
L = FreeBox[DX].size;
S = FreeBox[DX].Add;
for (; DX0 > i; DX0--) {
FreeBox[DX0] = FreeBox[DX0 - 1];
}
FreeBox[DX0].size = L;
FreeBox[DX0].Add = S;
}
break;
case 1:
//处理新增加的空表目
//把新空表目添加到DX+1处
for (i = DX0; i < DXMAX - 1; i ++ ) {
FreeBox[i] = FreeBox[i + 1];
}
break;
}
}
int printYIFENPEI() {
int i;
int choose;
system("cls");
if(TX == 0) {
printf("没有作业...按任意键返回\n");
getch();
return 0;
}
printf("作业列表\n");
for (i = 1; i <= TX; i ++) {
printf("【%d】 NAME: %s, ADD: %d, SIZE: %dK\n", i, YIFEN[i].fact.NAME, YIFEN[i].fact.Add, YIFEN[i].fact.size);
}
printf("\n空闲列表\n");
for (i = 0; i <= DX; i ++) {
printf("【%d】 ADD: %d, SIZE: %dK\n", i, FreeBox[i].Add, FreeBox[i].size);
}
printf("选择要释放的作业序号:");
scanf("%d", &choose);
return (choose);
}
/*释放作业或进程空间*/
void freeMemory() {
int i;
int choose, DX0;
int L;
int S;
printf("kao\n");
choose = printYIFENPEI();
if (choose > TX || choose == 0) {
return;
}
L = YIFEN[choose].fact.size;
S = YIFEN[choose].fact.Add;
DX0 = 0;
while (DX0 <= DX && S > FreeBox[DX0].Add) {
DX0++;
}
if (DX0 > (DXMAX-1)) {
printf("空间溢出...\n");
getch();
return;
}
//是否有下临空闲区
if (FreeBox[DX0].Add == (S + L)) {
L += FreeBox[DX0].size;
if(DX0 != 0 && (FreeBox[DX0 - 1].Add + FreeBox[DX0 - 1].size) == S) {
//又有上临空闲区
FreeBox[DX0 - 1].size += L;
FreeBox[DX0].state = 0;
DX--;
TurnFreeBox(DX0, 1); //重新整理表
} else {
FreeBox[DX0].size = L;
FreeBox[DX0].Add = S;
}
} else {
//第一个IF不成立 即没有下临
if (DX0 != 0 && (FreeBox[DX0 - 1].Add + FreeBox[DX0 - 1].size) == S) {
//只有上临
FreeBox[DX0 - 1].size += L;
} else {
if((DX + 1) < (DXMAX-1)) {
DX++;
FreeBox[DX].Add = S;
FreeBox[DX].size = L;
FreeBox[DX].state = 1;
TurnFreeBox(DX0, 2);
} else {
printf("释放空间失败!\n");
return;
}
}
}
//处理已分配表信息
for (i = choose; i < TXMAX - 1; i++) {
YIFEN[i] = YIFEN[i + 1];
}
TX--;
printf("释放作业成功!\n");
getch();
}
/*初始化程序*/
void init() {
int i = 0;
strcpy(YIFEN[0].fact.NAME, "操作系统");
YIFEN[0].fact.Add = 0;
YIFEN[0].fact.size = 40;
TX = 0;
FreeBox[0].Add = 40;
FreeBox[0].size = 600;
FreeBox[0].state = 1;
DX = 0;
for (i++; i < DXMAX; i++) {
FreeBox[0].state = 0;
}
}
//菜单
void manu() {
printf("请选择菜单:1 -- 添加作业; 2 -- 释放空间; 0 -- 退出\n");
}
void main() {
int flag;
init();
manu();
scanf("%d", &flag);
while(flag != 0) {
switch (flag) {
case 1:
addProcess(); system("cls");
break;
case 2:
freeMemory(); system("cls");
break;
}
manu();
scanf("%d", &flag);
}
getch();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -