C语言实现位示图磁盘空间管理(支持连续和离散分配)

本文介绍如何使用C语言实现一个位示图磁盘空间管理程序,支持自定义m行n列的位示图,并提供连续分配和离散分配两种方式,以及相应的磁盘块回收功能。

代码实现

#include <stdio.h>
#include <stdlib.h>

#define MAX_ROW 100 // 最大行数
#define MAX_COL 100 // 最大列数

int bitmap[MAX_ROW][MAX_COL]; // 位示图数组
int row, col; // 行数和列数

// 初始化位示图
void init_bitmap() {
    printf('请输入位示图的行数和列数(以空格分隔):');
    scanf('%d %d', &row, &col);
    if (row > MAX_ROW || col > MAX_COL) {
        printf('超过最大行数或列数!\n');
        exit(1);
    }
    printf('请输入位示图的初始状态(0表示空闲,1表示已分配):\n');
    for (int i = 0; i < row; i++) {
        for (int j = 0; j < col; j++) {
            scanf('%d', &bitmap[i][j]);
        }
    }
}

// 显示位示图
void show_bitmap() {
    printf('当前位示图状态:\n');
    for (int i = 0; i < row; i++) {
        for (int j = 0; j < col; j++) {
            printf('%d ', bitmap[i][j]);
        }
        printf('\n');
    }
}

// 连续分配盘块
int allocate_contiguous(int size) {
    int start = -1; // 连续空闲区的起始位置
    int count = 0; // 连续空闲区的长度
    for (int i = 0; i < row; i++) {
        for (int j = 0; j < col; j++) {
            if (bitmap[i][j] == 0) { // 如果当前位置为空闲
                if (start == -1) { // 如果是第一个空闲位置
                    start = j; // 记录起始位置
                }
                count++; // 连续空闲区长度增加
                if (count == size) { // 如果连续空闲区长度达到要求
                    for (int k = start; k < start + size; k++) {
                        bitmap[i][k] = 1; // 修改位示图
                    }
                    return start; // 返回起始位置
                }
            } else { // 如果当前位置已分配
                start = -1; // 连续空闲区起始位置重置
                count = 0; // 连续空闲区长度重置
            }
        }
        start = -1; // 连续空闲区起始位置重置
        count = 0; // 连续空闲区长度重置
    }
    return -1; // 分配失败,返回-1
}

// 离散分配盘块
int allocate_dispersed(int size) {
    int count = 0; // 空闲位置计数器
    int pos[size]; // 空闲位置数组
    for (int i = 0; i < row; i++) {
        for (int j = 0; j < col; j++) {
            if (bitmap[i][j] == 0) { // 如果当前位置为空闲
                pos[count++] = i * col + j; // 记录空闲位置
                if (count == size) { // 如果空闲位置数达到要求
                    for (int k = 0; k < size; k++) {
                        int r = pos[k] / col; // 计算行号
                        int c = pos[k] % col; // 计算列号
                        bitmap[r][c] = 1; // 修改位示图
                    }
                    return pos[0]; // 返回第一个空闲位置
                }
            }
        }
    }
    return -1; // 分配失败,返回-1
}

// 回收盘块
void recycle_blocks() {
    printf('请选择回收方式(1:按文件回收,2:按盘块回收):');
    int choice;
    scanf('%d', &choice);
    if (choice == 1) { // 按文件回收
        printf('请输入要回收的文件占用的盘块号(以空格分隔):');
        int start, size;
        scanf('%d %d', &start, &size);
        if (start < 0 || start >= row * col || size <= 0) {
            printf('盘块号或大小不合法!\n');
            return;
        }
        int r = start / col; // 计算起始位置的行号
        int c = start % col; // 计算起始位置的列号
        for (int i = r; i < r + size; i++) {
            for (int j = 0; j < col; j++) {
                bitmap[i][j] = 0; // 修改位示图
            }
        }
        printf('回收成功!\n');
    } else if (choice == 2) { // 按盘块回收
        printf('请输入要回收的盘块号(以空格分隔):');
        int block;
        scanf('%d', &block);
        if (block < 0 || block >= row * col) {
            printf('盘块号不合法!\n');
            return;
        }
        int r = block / col; // 计算行号
        int c = block % col; // 计算列号
        if (bitmap[r][c] == 0) { // 如果该盘块已空闲
            printf('该盘块已空闲!\n');
            return;
        }
        bitmap[r][c] = 0; // 修改位示图
        printf('回收成功!\n');
    } else {
        printf('选择不合法!\n');
    }
}

int main() {
    init_bitmap();
    show_bitmap();
    int choice;
    do {
        printf('请选择操作(1:分配盘块,2:回收盘块,0:退出):');
        scanf('%d', &choice);
        switch (choice) {
            case 1: {
                printf('请选择分配方式(1:连续分配,2:离散分配):');
                int method;
                scanf('%d', &method);
                printf('请输入要分配的盘块数:');
                int size;
                scanf('%d', &size);
                int start;
                if (method == 1) {
                    start = allocate_contiguous(size);
                } else if (method == 2) {
                    start = allocate_dispersed(size);
                } else {
                    printf('选择不合法!\n');
                    break;
                }
                if (start == -1) {
                    printf('分配失败!\n');
                } else {
                    printf('分配成功!分配的盘块号为:');
                    for (int i = start; i < start + size; i++) {
                        printf('%d ', i);
                    }
                    printf('\n');
                    show_bitmap();
                }
                break;
            }
            case 2: {
                recycle_blocks();
                show_bitmap();
                break;
            }
            case 0: {
                printf('退出程序!\n');
                break;
            }
            default: {
                printf('选择不合法!\n');
                break;
            }
        }
    } while (choice != 0);
    return 0;
}

代码说明

  • 使用二维数组 bitmap 表示位示图,数组元素为 0 表示空闲,为 1 表示已分配。
  • init_bitmap() 函数用于初始化位示图,可以自定义行数、列数以及初始状态。
  • show_bitmap() 函数用于显示当前位示图的状态。
  • allocate_contiguous() 函数用于连续分配盘块,返回分配的起始盘块号,如果分配失败则返回 -1。
  • allocate_dispersed() 函数用于离散分配盘块,返回分配的第一个盘块号,如果分配失败则返回 -1。
  • recycle_blocks() 函数用于回收盘块,支持按文件回收和按盘块回收两种方式。
  • main() 函数是程序的入口,提供用户交互界面,可以选择分配盘块、回收盘块以及退出程序。

总结

本文介绍了如何使用C语言实现一个简单的位示图磁盘空间管理程序,该程序支持自定义位示图大小、连续分配、离散分配以及盘块回收功能。实际应用中,还需要根据具体需求进行改进和完善。

C语言实现位示图磁盘空间管理(支持连续和离散分配)

原文地址: https://www.cveoy.top/t/topic/f1EI 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录