⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dycsize.cpp

📁 数据结构课程设计
💻 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 + -