📄 neicun.cpp
字号:
#include<stdio.h>
#define N 3
#define M 4
struct student
{
int first;
int last;
}node[N],node1[M];
void save()
{
FILE *fp;
int i;
if((fp=fopen("123.txt","w"))==NULL)
{
printf("不能打开\n");
return;
}
for(i=0;i<N;i++)
if(fwrite(&node[i],sizeof(struct student),1,fp)!=1)
printf("失败\n");
fclose(fp);
}
void save1()
{
FILE *fp;
int i;
if((fp=fopen("123.txt","w"))==NULL)
{
printf("不能打开\n");
return;
}
for(i=0;i<M;i++)
if(fwrite(&node1[i],sizeof(struct student),1,fp)!=1)
printf("失败\n");
fclose(fp);
}
void print()
{
int i=0;
FILE *fp;
if((fp=fopen("123.txt","r"))==NULL)
{
printf("不能打开\n");
return;
}
printf("空闲区号 首地址 尾地址\n");
for(i=0;i<M;i++)
{
fread(&node[i],sizeof(struct student),1,fp);
if(node[i].first>node[i].last||node[i].first==0&&node[i].last==0)
continue;
printf(" %d %d %d\n",i+1,node[i].first,node[i].last);
}
}
void create()
{
int i=0,a,b;
loop:
printf("请输入第%d个空闲区的首地址:",i+1);
scanf("%d",&a);
if(a<0)
goto loop;
else node[i].first=a;
loop1:
printf("请输入第%d个空闲区的尾地址:",i+1);
scanf("%d",&b);
if(b<a)
goto loop1;
else node[i].last=b;
for(i=1;i<N;i++)
{
loop2:
printf("请输入第%d个空闲区的首地址:",i+1);
scanf("%d",&a);
if(a<=node[i-1].last)
goto loop2;
else node[i].first=a;
loop3:
printf("请输入第%d个空闲区的尾地址:",i+1);
scanf("%d",&b);
if(b<node[i].first)
goto loop3;
else node[i].last=b;
}
}
//首次适应分配算法
void first_fp()
{
int unit,flag=0;
printf("请输入要分配的内存大小:\n");
scanf("%d",&unit);
for(int i=0;i<N;i++)
{
int pt=node[i].last-node[i].first+1;
if(unit<pt&&flag==0)
{
node[i].first=node[i].first+unit;
flag=1;
}
}
if(flag==0)
printf("分配失败\n\n\n");
save();
}
//最佳分配算法
void best_fp()
{
int unit,flag=0;
int pt[N],first_pt[N];
printf("请输入要分配的内存大小:\n");
scanf("%d",&unit);
for(int i=0;i<N;i++)
{
pt[i]=first_pt[i]=node[i].last-node[i].first+1;
}
for(int j=0;j<N-1;j++)
for(i=j+1;i<N;i++)
{
int temp=0;
if(pt[i]<pt[j])
{
temp=pt[j];
pt[j]=pt[i];
pt[i]=temp;
}
}
for(i=0;i<N;i++)
if((pt[i]-unit)>=0)
if(pt[i]==first_pt[i]&&flag==0)
{
node[i].first+=unit;
flag=1;
}
if(flag==0)
printf("分配失败\n\n\n");
save();
}
//内存回收
void reward_hs()
{
int n,m,flag=0,pk=0;
loop5:
printf("请输入内存的首地址:\n");
scanf("%d",&n);
for(int i=0;i<N;i++)
{
if(node[i].first<=n&&n<=node[i].last)
goto loop5;
}
loop6:
printf("请输入内存大小:\n");
scanf("%d",&m);
for(i=0;i<N;i++)
{
int p=i;
if(node[i+1].first-(n+m-1)>0&&pk==0)
{
pk=1;
if(n-node[i].last==1&&node[i+1].first-(n+m-1)==1)
{
node[i].last=node[i+1].last;
for(int j=i+1;j<N;j++)
{
node[j].first=node[j+1].first;
node[j].last=node[j+1].last;
}
break;
}
else if(n-node[i].last==1)
node[i].last=n+m-1;
else if(node[i+1].first-(n+m-1)==1)
node[i+1].first=n;
else if(n-node[i].last!=1&&node[i+1].first-(n+m-1)!=1)
{
flag=1;
for(int k=0;k<N;k++)
{
node1[k].first=node[k].first;
node1[k].last=node[k].last;
}
for(int j=M-1;j>i;j--)
{
node1[j+1].first=node1[j].first;
node1[j+1].last=node1[j].last;
}
node1[p+1].first=n;
node1[p+1].last=n+m-1;
}
break;
}
else
goto loop6;
}
if(flag==1)
save1();
else save();
}
// printf("%d",node[N+1]);
// for(i=0;i<M;i++)
// printf("%d %d\n",node1[i].first,node1[i].last);
void main(void)
{
int a;
loop4:
printf("*******************************\n");
printf("1 建立空闲区表\n");
printf("2 显示空闲区表\n");
printf("3 首次适应分配算法\n");
printf("4 最佳分配算法\n");
printf("5 内存回收\n");
printf("6 退出\n");
printf("*******************************\n");
printf("请选择数字1,2,3,4,5,6\n");
scanf("%d",&a);
printf("\n");
switch(a)
{
case 1:
create();
save();
goto loop4;
case 2:
print();
goto loop4;
case 3:
first_fp();
goto loop4;
case 4:
best_fp();
goto loop4;
case 5:
reward_hs();
goto loop4;
case 6:
return;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -