C语言实现磁盘空间位示图管理算法
#include <stdio.h>
#include <stdlib.h>
#define MAX_ROW 10
#define MAX_COL 10
int bitmap[MAX_ROW][MAX_COL]; // 位示图数组
int file_size = 0; // 文件大小
int block_size = 0; // 块大小
int file_blocks = 0; // 文件所占块数
// 初始化位示图
void init_bitmap() {
int i, j;
for (i = 0; i < MAX_ROW; i++) {
for (j = 0; j < MAX_COL; j++) {
bitmap[i][j] = 0;
}
}
}
// 显示位示图
void show_bitmap() {
int i, j;
for (i = 0; i < MAX_ROW; i++) {
for (j = 0; j < MAX_COL; j++) {
printf('%d ', bitmap[i][j]);
}
printf('\n');
}
}
// 连续分配
int allocate_continuous() {
int i, j, k, flag = 0;
for (i = 0; i < MAX_ROW; i++) {
for (j = 0; j < MAX_COL; j++) {
if (bitmap[i][j] == 0) {
flag++;
if (flag == file_blocks) { // 找到足够的连续空闲块
for (k = j - file_blocks + 1; k <= j; k++) {
bitmap[i][k] = 1; // 修改位示图
}
return i * MAX_COL + j - file_blocks + 1; // 返回分配的第一个块号
}
} else {
flag = 0; // 连续块被打断,重新计数
}
}
flag = 0; // 连续块被打断,重新计数
}
return -1; // 没有足够的连续空闲块
}
// 离散分配
int allocate_discrete() {
int i, j, k, flag = 0;
for (i = 0; i < MAX_ROW; i++) {
for (j = 0; j < MAX_COL; j++) {
if (bitmap[i][j] == 0) {
bitmap[i][j] = 1; // 修改位示图
flag++;
if (flag == file_blocks) { // 找到足够的离散空闲块
return i * MAX_COL + j - file_blocks + 1; // 返回分配的第一个块号
}
}
}
}
return -1; // 没有足够的离散空闲块
}
// 分配磁盘块
int allocate_blocks() {
int block_num;
printf('请输入文件大小(字节):');
scanf('%d', &file_size);
printf('请输入块大小(字节):');
scanf('%d', &block_size);
file_blocks = (file_size + block_size - 1) / block_size; // 计算文件所占块数
printf('请选择分配方式(1.连续分配 2.离散分配):');
scanf('%d', &block_num);
if (block_num == 1) {
block_num = allocate_continuous(); // 连续分配
} else if (block_num == 2) {
block_num = allocate_discrete(); // 离散分配
} else {
printf('输入不合法!\n');
return -1;
}
if (block_num == -1) {
printf('磁盘空间不足!\n');
return -1;
}
printf('文件分配成功,分配的第一个块号为:%d\n', block_num);
return block_num;
}
// 回收磁盘块
void free_blocks() {
int block_num;
printf('请输入要回收的块号:');
scanf('%d', &block_num);
if (block_num < 0 || block_num >= MAX_ROW * MAX_COL) {
printf('输入不合法!\n');
return;
}
int row = block_num / MAX_COL;
int col = block_num % MAX_COL;
if (bitmap[row][col] == 0) {
printf('该块未被分配!\n');
return;
}
bitmap[row][col] = 0; // 修改位示图
printf('块号 %d 回收成功!\n', block_num);
}
int main() {
init_bitmap(); // 初始化位示图
int choice;
while (1) {
printf('请选择操作(1.分配磁盘块 2.回收磁盘块 3.显示位示图 4.退出程序):');
scanf('%d', &choice);
switch (choice) {
case 1:
allocate_blocks(); // 分配磁盘块
break;
case 2:
free_blocks(); // 回收磁盘块
break;
case 3:
show_bitmap(); // 显示位示图
break;
case 4:
exit(0); // 退出程序
default:
printf('输入不合法!\n');
break;
}
}
return 0;
}
原文地址: https://www.cveoy.top/t/topic/f1FU 著作权归作者所有。请勿转载和采集!