#include iostream#include stringh#include stdlibh#include stdiohusing namespace std;int map100100;typedef struct file char fileName30; 文件名字 int length; 文件长度 int start
#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" ); } }
/*
-
*函数名:main()
-
*描述: 主函数
-
*参数: 无
-
*返回值: 0 **/ int main() { mapInit(); while (1) { printf("请选择要执行的操作:\n"); printf("1.新建文件\n"); printf("2.回收文件\n"); printf("3.退出\n");
char s[30]; int choose; scanf("%d", &choose); switch (choose) { case 1: printf("请输入文件名和文件长度:"); scanf("%s", s); scanf("%d", &File[fileTotalNum].length); allocation(fileTotalNum, true); // 采用连续分配方式 strcpy(File[fileTotalNum].fileName, s); fileTotalNum++; break; case 2: printf("请输入要回收的文件名:"); scanf("%s", s); recovery(s); break; case 3: exit(0); default: printf("输入错误,请重新输入!\n"); break; }} return 0;
原文地址: https://www.cveoy.top/t/topic/gBGD 著作权归作者所有。请勿转载和采集!