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

📄 neicun.cpp

📁 自己做的一个模拟虚拟内存的小程式
💻 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 + -