⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 磁盘空间管理.cpp

📁 模拟UNIX磁盘空间管理中使用的分组链接法。在内存中建立一个虚拟盘
💻 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 + -