📄 lx.cpp
字号:
#define n 10
#define m 10
#define area 1000
#define minisize 50
#include "stdio.h"
void main()
{struct
{float address; /* 已分分区起始块号*/
float length; /* 已分分区长度,单位为字节*/
int flag; /*已分配区表登记栏标志,用"0"表示空栏目,已分配用文件名表示*/
}used_table[n]; /*已分配区表*/
struct
{float address; /*分区起始块号*/
float length; /*空闲区长度,单位为块*/
int flag; /*空闲表登记栏标志,用"0"表示空栏目,"1"表示未分配*/
}table[n]; /*空闲表*/
int i,a,name,j=0,flag=0,right=0,h;
float length,head,tail;
for(i=0;i<n;i++)
used_table[i].flag=0; /*已分配区表初始化*/
table[0].address=0.0;
table[0].length=1000.0;
table[0].flag=1; /*空闲表初始化*/
for(i=1;i<m;i++)
table[i].flag=0;
printf("请选择服务类型 \n");
printf("1 调入新的文件\n");
printf("2 收回文件磁盘空间 \n");
printf("3 打印磁盘分配情况表\n");
printf("4 退出 \n"); /*输出功能提示*/
scanf("%d",&a); /*读入选择的服务 */
while(a!=4)
{
if(a==1) /*若为1则分配磁盘空间*/
{
printf("输入文件名:");
scanf("%d",&name);
printf("输入所需磁盘大小:");
scanf("%f",&length); /*读入文件名字和所需磁盘大小*/
i=0;
while(i<n&&right==0)
{ if(table[i].flag==1&&table[i].length>=length)
{ break;
}i++;
} /*找到一个合适的空间,分配给文件*/
if(i>=n)
printf("无足够磁盘空间\n");/*若磁盘不足,则给于相应的提示*/
else
{while(used_table[j].flag!=0)
j++;
used_table[j].address=table[i].address;
used_table[j].length=length; /*对磁盘取表和已分配区表进行调整*/
used_table[j].flag=name;
table[i].address=table[i].address+length;
table[i].length-=length;
}
}
else if(a==2)
{ printf("输入想删除的文件名: ");
scanf("%d",&name);
h=0;
for(i=0;i<n;i++)
if(used_table[i].flag==name)
{ head=used_table[i].address;
tail=used_table[i].address+used_table[i].length;
used_table[i].flag=0;}
while(table[h].flag!=0) h++;
for(i=0;i<m;i++)
if((table[i].address==tail)&&(table[i].flag==1))
{ tail=tail+table[i].length;
table[i].flag=0;} /*若收回磁盘区域后续磁盘未分配,则将其合并*/
for(j=0;j<m;j++)
if(head==(table[j].address+table[j].length)&&(table[j].flag==1))
{ table[j].length+=(tail-head);
flag=1;
} /*若收回磁盘区域前部未分配,则将其合并*/
if(flag==0)
{ table[h].address=head;
table[h].length=tail-head;
table[h].flag=1;flag=0;}
}
else if(a==3) /*若选择3则打印磁盘分配表*/
{ printf("used_table\n");
printf("起始块号 \t长度 \t标志\n");
for(i=0;i<n;i++)
{ if(used_table[i].flag!=0)
printf("%d %f\t%f\t%d\n",i,used_table[i].address,used_table[i].length,used_table[i].flag);
}
printf("\ntable\n");
printf(" 起始块号 \t长度 \t标志\n");
for(i=0;i<n;i++)
{ if(table[i].flag==1)
printf(" %d %f\t%f\t%d\n",i,table[i].address,table[i].length,table[i].flag);
}
}
printf("请选择服务类型\n");
scanf("%d",&a);
}
}/*结束*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -