📄 磁盘空间管理.cpp
字号:
#include "stdio.h"
#include "stdlib.h"
#define STACK_SIZE 10//堆栈空间
int i;
void free(int fileno);
int alloc(int fileno, int blockd);
struct Blocd /*定义一个由60个元素构成的结构数组
block[60]用作磁盘块存放。*/
{ int blocl[10];//0~9
bool node;
//用于在空闲磁盘块号链中存放磁盘块号
}block[60];//0~59
struct Stack
{
int S_nfree;//空闲磁盘块数
int *base;//栈底,初始为Null
int *top;//栈顶指针,初始为Null
}S_free;
struct File
{
bool fileinit;//标识文件是否创建
int file_size;//文件长度
char name[20];//文件名
int fileblocd[60];//用于记录分别分配给文件的磁盘块号
}file[6];
void print_stack()
{
Stack sq;
int e;
sq=S_free;
sq.top=S_free.top;
sq.top--;
for(int i=0;i<10-S_free.S_nfree;i++)
{
printf("\t\t-1\n");
}
for(i=0;i<S_free.S_nfree;i++)
{
e=*sq.top;
printf("\t\t%d\n",e);
sq.top--;
}
}
void push(Stack &s,int e)
{
*s.top=e;
s.S_nfree++;
s.top++;
}
void pop(Stack &s,int &e)
{
s.top--;
e=*s.top;
s.S_nfree--;
}
void init()
{//初始化磁盘块
for(i=9;i<=49;i+=10)
{
block[i].node=true;
for(int j=0;j<10;j++)//每块第一个存放下一组的块号
{
block[i].blocl[j]=10+i-j;
}
}
block[59].node=false;
//初始化堆栈
S_free.base=(int *)malloc(STACK_SIZE*sizeof(int));
if (!S_free.base)
{
printf("分配失败!");
exit(0);
}
S_free.top=S_free.base;
S_free.S_nfree=0;
//前10个空磁盘块入栈
for(i=9;i>=0;i--)
{
push(S_free,i);
}
//记录文件占用磁盘块状态的file结构数组
for(i=1;i<6;i++)
{
file[i].file_size=0;
}
}
int alloc()
{
printf("\t\t\t\t->创建文件!\n");
int fileno;
int blockd;
filec:
printf("输入文件号:");
scanf("%d",&fileno);
if(file[fileno].fileinit==true)
{
printf("该文件已存在!\n");
goto filec;
}else if(fileno<1||fileno>5)
{
printf("文件号非法!\n");
goto filec;
}
printf("输入文件名:");
scanf("%s",&file[fileno].name);
printf("输入文件所占块数:");
scanf("%d",&blockd);
for(i=0;i<blockd;i++)
{ if(S_free.top==S_free.base)
{
printf("\n磁盘已经满或空间不足,不能再建立文件!\n删除创建中的文件!\n");
//free(fileno);
printf("要删除的文件大小%d\n",file[fileno].file_size);
int p=file[fileno].file_size;
for(i=0;i<p;i++)
{
if(S_free.S_nfree==STACK_SIZE)//站满
{
block[file[fileno].fileblocd[i]].node=true;
for(int m=9;m>=0;m--)//站满,将站中磁盘快号放入当前文件盘快中
{
pop(S_free,block[file[fileno].fileblocd[i]].blocl[m]);
}
push(S_free,file[fileno].fileblocd[i]);//接着压文件入堆栈
file[fileno].file_size--;
}
else
{
push(S_free,file[fileno].fileblocd[i]);//文件拥有的磁盘快入栈
file[fileno].file_size--;
}
}
file[fileno].fileinit=false;
return 0;
}
else if(S_free.S_nfree==1)//栈底元素
{
pop(S_free,file[fileno].fileblocd[i]);
file[fileno].file_size++;//文件大小
int m=*S_free.top;//获得站底的快号
if(block[m].node==true)//是一个节点
{
block[m].node=false;
for(int k=0;k<10;k++)
{
push(S_free,block[m].blocl[k]);
}
}else if(block[m].node=false)//最后一个节点或不是节点
{
if(i==blockd-1)//文件只需要最后一个磁盘块了
{
pop(S_free,file[fileno].fileblocd[i]);
file[fileno].file_size++;//文件大小
}else
{
printf("没有足够的空间了\n");
//free(fileno);
printf("要删除的文件大小%d\n",file[fileno].file_size);
int p=file[fileno].file_size;
for(i=0;i<p;i++)
{
if(S_free.S_nfree==STACK_SIZE)//站满
{
block[file[fileno].fileblocd[i]].node=true;
for(int m=9;m>=0;m--)//站满,将站中磁盘快号放入当前文件盘快中
{
pop(S_free,block[file[fileno].fileblocd[i]].blocl[m]);
}
push(S_free,file[fileno].fileblocd[i]);//接着压文件入堆栈
file[fileno].file_size--;
}
else
{
push(S_free,file[fileno].fileblocd[i]);//文件拥有的磁盘快入栈
file[fileno].file_size--;
}
}
file[fileno].fileinit=false;
printf("创建失败!");
return 0;
}
}
}
else{
pop(S_free,file[fileno].fileblocd[i]);
file[fileno].file_size++;//文件大小
}
}
file[fileno].fileinit=true;
printf("文件%s创建成功!\n",file[fileno].name);
printf("文件%s占用块号:\n",file[fileno].name);
for(i=0;i<blockd;i++)
printf("%d\t",file[fileno].fileblocd[i]);
printf("\n 文件大小为%d\n",file[fileno].file_size);
printf("堆栈中现在的情况是:\n");
print_stack();
return 1;
}
int realse()
{
printf("\t\t\t\t->删除文件\n");
int filenum;
printf("输入文件号:");
scanf("%d",&filenum);
if(file[filenum].fileinit==false)
{
printf("该文件不存在!\n");
return 0;
}else if(filenum<1||filenum>5)
{
printf("文件号非法!\n");
return 0;
}
//free(filenum);
printf("要删除的文件大小%d\n",file[filenum].file_size);
int p=file[filenum].file_size;
for(i=0;i<p;i++)
{
if(S_free.S_nfree==STACK_SIZE)//站满
{
block[file[filenum].fileblocd[i]].node=true;
for(int m=9;m>=0;m--)//站满,将站中磁盘快号放入当前文件盘快中
{
pop(S_free,block[file[filenum].fileblocd[i]].blocl[m]);
}
push(S_free,file[filenum].fileblocd[i]);//接着压文件入堆栈
file[filenum].file_size--;
}
else
{
push(S_free,file[filenum].fileblocd[i]);//文件拥有的磁盘快入栈
file[filenum].file_size--;
}
}
file[filenum].fileinit=false;
printf("文件删除成功!\n");
return 1;
}
void main() /*从终端输入命令,控制磁盘块的分配与回收操作,
并在每次分配与回收后显示分配与回收是否成功,
以及分配、回收的磁盘块号。*/
{
int c;
init();//调用init( )函数完成初始设置。
while(1)
{
printf("\n输入选择(1创建文件,2删除文件):");
scanf("%d",&c);
switch(c)
{
case 1:alloc();break;
case 2:realse();break;
default:printf("选择:1 或 2\n");break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -