C语言位示图文件分配模拟实现:连续分配与离散分配
#include
int map[100][100];
typedef struct file { char fileName[30]; /* 文件名字 / int length; / 文件长度 / int start; / 文件存储时 的初始位置 */ } file;
file File[60]; int line, column; /* 行 列 / int fileTotalNum = 0; / 总文件数 */
/*
- *函数名:mapInit()
- *描述: 对位示图进行初始化
- *参数: 无
- *返回值: 无 **/ void mapInit() { int i, j; printf("请输入行和列:"); scanf("%d%d", &line, &column); for (i = 0; i < line; i++) { for (j = 0; j < column; j++) { map[i][j] = 0; printf("%3d", map[i][j]); } printf("\n"); } }
/*
- *函数名:allocation(int fileNum, bool isContinuous)
- *描述: 分配空间给文件,采用连续分配方式或离散分配方式
- *参数: fileNum 第几个文件 isContinuous 是否采用连续分配方式
- *返回值: 无 */ void allocation( int fileNum, bool isContinuous ) { int length = File[fileNum].length; int b[60]; int i, j; int x = 0; if (isContinuous) { // 连续分配方式 for (i = 0; i < line; i++) { for (j = 0; j < column; j++) { if (map[i][j] == 0) { b[x] = i * column + j; x++; if (x == length) break; / 这个 break ,跳出 j 循环 / } else x = 0; } if (x == length) break; / 这里 break, 跳出整个 for循环体 / } } else { // 离散分配方式 for (i = 0; i < length; i++) { int x, y; printf("请输入第%d个盘块的行列坐标:", i + 1); scanf("%d%d", &x, &y); if (x >= 0 && x < line && y >= 0 && y < column && map[x][y] == 0) { b[i] = x * column + y; } else { printf("输入的坐标不合法或该盘块已被占用,请重新输入\n"); i--; } } } if (length > x) printf("空间不足,无法分配\n"); else { File[fileNum].start = b[0]; for (int i = 0; i < x; i++) { int x1 = b[i] / column; int y1 = b[i] % column; map[x1][y1] = 1; / 置1 代表使用 过 */ } } for (i = 0; i < line; i++) { for (j = 0; j < column; j++) { printf("%3d", map[i][j]); } printf("\n"); } }
/*
- *函数名:recovery(char s[])
- *描述: 通过文件名回收文件占用空间,并将位示图中对应标志位重新初始化为0
- *参数: char s[] 文件名
- *返回值: 无 */ void recovery( char s[] ) { int cnt = -1; for ( int i = 0; i < fileTotalNum; i++ ) { if ( strcmp( s, File[i].fileName ) == 0 ) { cnt = i; / 记录下 第几个 文件 */ break; } } if ( cnt == -1 ) { printf( "没有此文件,请重新输入!\n" ); } int start = File[cnt].start; int length = File[cnt].length; for ( int i = start; i < start + length; i++ ) { int x1 = i / column; int y1 = i % column; map[x1][y1] = 0; } for ( int i = cnt + 1; i < fileTotalNum; i++ ) /*删除文件后 将其后面的文件前移 覆盖原来文件 */ { strcpy( File[i - 1].fileName, File[i].fileName ); File[i - 1].start = File[i].start; File[i - 1].length = File[i].length; } fileTotalNum--; printf( "回收成功\n" ); for ( int i = 0; i < line; i++ ) { for ( int j = 0; j < column; j++ ) { printf( "%3d", map[i][j] ); } printf( "\n" ); } }
int main() { int op, n, l; char fileName[30]; bool isContinuous; mapInit(); while (true) { printf("请选择操作:1.创建文件 2.回收文件 3.退出\n"); scanf("%d", &op); switch (op) { case 1: printf("请输入文件名、文件长度和分配方式(0为离散分配,1为连续分配):\n"); scanf("%s %d %d", fileName, &l, &n); File[fileTotalNum].length = l; strcpy(File[fileTotalNum].fileName, fileName); fileTotalNum++; isContinuous = (n == 1); allocation(fileTotalNum - 1, isContinuous); break; case 2: printf("请输入要回收的文件名:\n"); scanf("%s", fileName); recovery(fileName); break; case 3: exit(0); default: printf("无效的操作,请重新输入\n"); break; } } return 0; }
原文地址: https://www.cveoy.top/t/topic/owFv 著作权归作者所有。请勿转载和采集!