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

📄 lx.cpp

📁 连续磁盘存储空间的分配与回收 Windows操作系统
💻 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 + -