采用c语言实现首次适应算法完成主存空间的分配和回收 急
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了采用c语言实现首次适应算法完成主存空间的分配和回收 急相关的知识,希望对你有一定的参考价值。
/********************************内存管理模拟程序
*******************************/
#include<iostream.h>
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include <time.h>
#include <windows.h>
/*定义宏*/
#define TotalMemSize 1024 /*划分的物理块的大小,地址范围0~1023*/
#define MinSize 2 /*规定的不再分割的剩余分区的大小*/
#define getpch(type) (type*)malloc(sizeof(type))
/*定义内存块*/
typedef struct memBlock
struct memBlock *next;/*指向下一个块*/
int stAddr; /*分区块的初始地址*/
int memSize; /*分区块的大小*/
int status; /*分区块的状态,0:空闲,1:以被分配*/
MMB;
/*定义全局变量*/
MMB *idleHead=NULL; /*空闲分区链表的头指针*/
MMB *usedHead=NULL; /*分配分区链表的头指针*/
MMB *usedRear=NULL; /*分配分区链表的链尾指针*/
MMB *np; /*循环首次适应算法中指向即将被查询的空闲块*/
int idleNum=1;/*当前空闲分区的数目*/
int usedNum=0;/*当前已分配分区的数目*/
MMB *memIdle=NULL; /*指向将要插入分配分区链表的空闲分区*/
MMB *memUsed=NULL; /*指向将要插入空闲分区链表的已分配分区*/
int flag=1;/*标志分配是否成功,1:成功*/
/*函数声明*/
void textcolor (int color);/*输出着色*/
void InitMem();/*初始化函数*/
int GetUseSize(float miu,float sigma); /*获得请求尺寸*/
MMB *SelectUsedMem(int n);/*选择待释放的块*/
void AddToUsed();/*将申请到的空闲分区加到分配分区链表中*/
int RequestMemff(int usize); /*请求分配指定大小的内存,首次适应算法*/
int RequestMemnf(int usize); /*请求分配指定大小的内存,循环首次适应算法*/
void AddToIdle();/*将被释放的分配分区加到空闲分区链表中(按地址大小)*/
void ReleaseMem(); /*释放指定的分配内存块*/
/*主函数*/
void main()
int sim_step;
float miu,sigma; /*使随机生成的请求尺寸符合正态分布的参数*/
int i;
int a;
MMB *p;
/* double TotalStep=0,TotalSize=0,TotalRatio=0,TotalUSize=0,Ratio=0,n=0;
double aveStep=0,aveSize=0,aveRatio=0;
int step=0,usesize=0; */
textcolor(11);
printf("\n\t\t内存管理模拟程序\n\n");
/* InitMem();*/
while(true)
double TotalStep=0,TotalSize=0,TotalRatio=0,TotalUSize=0,Ratio=0,n=0;
double aveStep=0,aveSize=0,aveRatio=0;
int step=0,usesize=0;
InitMem();
textcolor(12);
printf("\n\n首次适应算法: 0");
printf("\n循环首次适应算法: 1\n");
textcolor(11);
printf("\n请选择一种算法:");
scanf("%d",&a);
textcolor(15);
printf("\n输入一定数量的步数:(sim_step)");
scanf("%d",&sim_step);
printf("\n 输入使随机生成的请求尺寸符合正态分布的参数:miu,sigma ");
scanf("%f,%f",&miu,&sigma);
for(i=1;i<=sim_step;i++)
textcolor(10);
printf("\n\n#[%d]\n",i);
do
usesize=GetUseSize(miu,sigma);
while((usesize<0)||(usesize>TotalMemSize))
usesize=GetUseSize(miu,sigma);
textcolor(13);
printf("\n\n申请的内存尺寸为:%d",usesize);
printf("\n此时可用的空闲分区有 %d 块情况如下:",idleNum);
p=idleHead;
textcolor(15);
while(p!=NULL)
printf("\n始址:%d\t 尺寸:%d",p->stAddr,p->memSize);
p=p->next;
TotalSize+=usesize;
if(a==0)
step=RequestMemff(usesize);
else
step=RequestMemnf(usesize);
TotalStep+=step;
n++;
while(flag==1);
p=usedHead;
while(p!=NULL)
TotalUSize+=p->memSize;
printf("\n始址:%d\t 尺寸:%d",p->stAddr,p->memSize);
p=p->next;
textcolor(11);
if(TotalUSize!=0)
Ratio=TotalUSize/TotalMemSize;
TotalUSize=0;
printf("\n内存利用率NO.%d :%f%c",i,100*Ratio,'%');
else
Ratio=0;
printf("\n内存利用率NO.%d :%c%c",i,'0','%');
TotalRatio+=Ratio;
ReleaseMem();
if(n!=0)
textcolor(10);
aveStep=TotalStep/n;
aveSize=TotalSize/n;
aveRatio=TotalRatio/sim_step;
printf("\n平均搜索步骤:%f",aveStep);
printf("\n平均请求尺寸:%f",aveSize);
printf("\n平均内存利用率:%f",aveRatio);
// 输出着色 /////////////////////////////////////////
void textcolor (int color)
SetConsoleTextAttribute (GetStdHandle (STD_OUTPUT_HANDLE), color );
/******************************
函数名:InitMem()
用途:把内存初始化为一整块空闲块
****************************************/
void InitMem()
MMB *p;
p=getpch(MMB);
p->memSize=TotalMemSize;
p->stAddr=0;
p->status=0;
p->next=NULL;
idleHead=p;
np=idleHead;
usedHead=NULL;
usedRear=NULL;
idleNum=1;
usedNum=0;
flag=1;
memIdle=NULL;
memUsed=NULL;
/******************************
函数名:GetUseSize(float miu,float sigma)
用途:获得请求尺寸;
参数说明:float miu,float sigma :正态分布的参数
返回值:申请尺寸的大小;
****************************************************/
int GetUseSize(float miu,float sigma)
float r1,r2;
float u,v,w;
float x,y;
do
r1=rand()/32767.0;
r2=rand()/32767.0;
u=2*r1-1;
v=2*r2-1;
w=u*u+v*v;
while(w>1);
x=u*sqrt(((-log(w))/w));
y=v*sqrt(((-log(w))/w));
return miu+sigma*x;
/******************************
函数名:*SelectUsedMem(int n)
用途:选择待释放的块(0~n-1)
返回值:指向待释放的块的指针;
****************************************************/
MMB *SelectUsedMem(int n)
MMB *p;
int i,j;
if(n>0)
i = rand()%n ;
textcolor(5);
printf("\n\n当前已分配分区总数为:%d",n);
printf("\n待释放块的序号为:%d\n",i );
p=usedHead;
if(p!=NULL)
for(j=i;j>0;j--)
p=p->next;
return(p);
else
return(NULL);
else
printf("\n当前没有可释放的资源!\n");
/******************************
函数名:AddToUsed()
用途:将申请到的空闲分区加到分配分区链表中
***************************************************************/
void AddToUsed()
MMB *p;
memIdle->status=1;
if(usedHead==NULL)
usedHead=memIdle;
usedRear=usedHead;
else
usedRear->next=memIdle;
usedRear=memIdle;
usedNum++;
printf("\n当前分配分区共有%d块!",usedNum);
p=usedHead;
while(p!=NULL)
printf("\n始址:%d \t 尺寸:%d",p->stAddr,p->memSize);
p=p->next;
/******************************
函数名:RequestMemff(int usize)
参数说明:usize:请求尺寸的大小;
用途:请求分配指定大小的内存,首次适应算法
返回值:搜索步骤
***************************************************************/
int RequestMemff(int usize)
MMB *p1,*p2,*s;
int step;
int suc=0;
int size1,size2;
if(idleHead==NULL)
flag=0;
textcolor(12);
printf("\n分配失败!");
return 0;
else
if((idleHead->memSize)>usize)
size1=(idleHead->memSize)-usize;
if(size1<=MinSize)
memIdle=idleHead;
idleHead=idleHead->next;
memIdle->next=NULL;
idleNum--;
else
s=getpch(MMB);
s->memSize=usize;
s->stAddr=idleHead->stAddr;
s->status=1;
s->next=NULL;
memIdle=s;
idleHead->memSize=idleHead->memSize-usize;
idleHead->stAddr=idleHead->stAddr+usize;
step=1;
flag=1;
textcolor(12);
printf("\n分配成功!");
AddToUsed();
else
p1=idleHead;
step=1;
p2=p1->next;
while(p2!=NULL)
if((p2->memSize)>usize)
size2=(p2->memSize)-usize;
if(size2<=MinSize)
p1->next=p2->next;
memIdle=p2;
memIdle->next=NULL;
idleNum--;
else
s=getpch(MMB);
s->memSize=usize;
s->stAddr=p2->stAddr;
s->status=1;
s->next=NULL;
memIdle=s;
p2->memSize=p2->memSize-usize;
p2->stAddr=p2->stAddr+usize;
flag=1;
suc=1;
textcolor(12);
printf("\n分配成功!");
AddToUsed();
p2=NULL;
else
p1=p1->next;
p2=p2->next;
step++;
if(suc==0)
flag=0;
textcolor(12);
printf("\n分配失败!");
return step;
/******************************
函数名:AddToIdle()
用途:将被释放的分配分区加到空闲分区链表中(按地址递增顺序排列)
***************************************************************/
void AddToIdle()
MMB *p1,*p2;
int insert=0;
if((idleHead==NULL))
idleHead=memUsed;
idleNum++;
np=idleHead;
else
int Add=(memUsed->stAddr)+(memUsed->memSize);
if((memUsed->stAddr<idleHead->stAddr)&&(Add!=idleHead->stAddr))
memUsed->next=idleHead;
idleHead=memUsed;
idleNum++;
else
if((memUsed->stAddr<idleHead->stAddr)&&(Add==idleHead->stAddr))
idleHead->stAddr=memUsed->stAddr;
idleHead->memSize+=memUsed->memSize;
else
p1=idleHead;
p2=p1->next;
while(p2!=NULL)
if(memUsed->stAddr>p2->stAddr)
p1=p1->next;
p2=p2->next;
else
int Add1=p1->stAddr+p1->memSize;
int Add2=p2->stAddr-memUsed->memSize;
if((Add1==memUsed->stAddr)&&(memUsed->stAddr!=Add2))
p1->memSize=p1->memSize+memUsed->memSize;
if((Add1!=memUsed->stAddr)&&(memUsed->stAddr==Add2))
p2->memSize=p2->memSize+memUsed->memSize;
p2->stAddr=memUsed->stAddr;
if((Add1!=memUsed->stAddr)&&(memUsed->stAddr!=Add2))
memUsed->next=p2;
p1->next=memUsed;
if(np->stAddr==p2->stAddr)
np=p1->next;
idleNum++;
if((Add1==memUsed->stAddr)&&(memUsed->stAddr==Add2))
p1->memSize=p1->memSize+memUsed->memSize+p2->memSize;
p1->next=p2->next;
if((np->stAddr)==(p2->stAddr))
np=p1;
idleNum--;
p2=NULL;
insert=1;
if(insert==0)
p1->next=memUsed;
idleNum++;
/******************************
函数名:ReleaseMem()
用途:释放指定的分配内存块
***************************************************************/
void ReleaseMem()
MMB *q1,*q2;
MMB *s;
if(usedNum==0)
printf("\n当前没有分配分区!");
return;
else
s=SelectUsedMem(usedNum);
if(s!=NULL)
if(s->stAddr==usedHead->stAddr)
memUsed=usedHead;
usedHead=usedHead->next;
memUsed->next=NULL;
AddToIdle();
usedNum--;
else
q1=usedHead;
q2=q1->next;
while(q2!=NULL)
if(q2->stAddr!=s->stAddr)
q1=q1->next;
q2=q2->next;
else
q1->next=q2->next;
memUsed=q2;
memUsed->next=NULL;
if(q1->next==NULL)
usedRear=q1;
AddToIdle();
usedNum--;
q2=NULL;
/******************************
函数名:RequestMemnf(int usize)
参数说明:usize:请求尺寸的大小;
用途:请求分配指定大小的内存,循环首次适应算法
返回值:搜索步骤
***************************************************************/
int RequestMemnf(int usize)
MMB *p2,*p,*s;
int step;
int iNum=0;
int suc=0;
int size1,size2,size3;
if(idleHead==NULL)
flag=0;
printf("\n分配失败!");
return 0;
else
iNum=idleNum;
while(iNum>0)
iNum--;
if((np->memSize)>usize)
/*指针指向的空闲块满足条件,且正好为头指针*/
if(np->stAddr==idleHead->stAddr)
size1=(idleHead->memSize)-usize;
if(size1<=MinSize)
memIdle=idleHead;
idleHead=idleHead->next;
memIdle->next=NULL;
idleNum--;
else
s=getpch(MMB);
s->memSize=usize;
s->stAddr=idleHead->stAddr;
s->status=1;
s->next=NULL;
memIdle=s;
idleHead->memSize=idleHead->memSize-usize;
idleHead->stAddr=idleHead->stAddr+usize;
if((idleHead==NULL)||(idleHead->next==NULL))
np=idleHead;
else
np=idleHead->next;
else/*指针指向的空闲块满足条件,不为头指针*/
size2=(np->memSize)-usize;
if(size2<=MinSize) /*从空闲链表中删除*/
p=idleHead;
while(p->next->stAddr!=np->stAddr)
p=p->next;
p->next=np->next;
memIdle=np;
memIdle->next=NULL;
np=p;
idleNum--;
else
s=getpch(MMB);
s->memSize=usize;
s->stAddr=np->stAddr;
s->status=1;
s->next=NULL;
memIdle=s;
np->memSize=np->memSize-usize;
np->stAddr=np->stAddr+usize;
if(np->next==NULL)
np=idleHead;
else
np=np->next;
step=1;
flag=1;
suc=1;
textcolor(12);
printf("\n分配成功!");
AddToUsed();
iNum=0;
else /*当前指针指向的空闲区不满足条件*/
step=1;
p2=np->next;
if(p2==NULL)
np=idleHead;
iNum--;
else
if((p2->memSize)>usize)
size3=(p2->memSize)-usize;
if(size3<=MinSize)
np->next=p2->next;
memIdle=p2;
memIdle->next=NULL;
idleNum--;
else
s=getpch(MMB);
s->memSize=usize;
s->stAddr=p2->stAddr;
s->status=1;
s->next=NULL;
memIdle=s;
p2->memSize=p2->memSize-usize;
p2->stAddr=p2->stAddr+usize;
flag=1;
suc=1;
printf("\n分配成功!");
AddToUsed();
if(p2->next==NULL)
np=idleHead;
else
np=p2->next;
p2=NULL;
iNum=0;
else
np=np->next;
p2=p2->next;
iNum--;
step++;
// iNum--;
if(suc==0)
flag=0;
textcolor(12);
printf("\n分配失败!");
return step;
参考技术A 有没有具体的要求,比方说数据结构方面,我这有一个,你可以参考参考
#include"stdio.h"
#include"stdlib.h"
#define n 10 /*假定系统允许的最大作业为n,假定模拟实验中n值为10*/
#define m 10 /*假定系统允许的空闲区表最大为m,假定模拟实验中m值为10*/
#define minisize 100
struct
float address; /*已分分区起始地址*/
float length; /*已分分区长度,单位为字节*/
int flag; /*已分配区表登记栏标志,用"0"表示空栏目*/
used_table[n]; /*已分配区表*/
struct
float address; /*空闲区起始地址*/
float length; /*空闲区长度,单位为字节*/
int flag; /*空闲区表登记栏标志,用"0"表示空栏目,用"1"表示未分配*/
free_table[m]; /*空闲区表*/
void main( )
int i,a;
void allocate(char str,float leg);//分配主存空间函数
void reclaim(char str);//回收主存函数
float xk;
char J;/*空闲分区表初始化:*/
free_table[0].address=10240;
free_table[0].length=102400;
free_table[0].flag=1;
for(i=1;i<m;i++)
free_table[i].flag=0;/*已分配表初始化:*/
for(i=0;i<n;i++)
used_table[i].flag=0;
while(1)
printf("\n选择功能项(0-退出,1-分配主存,2-回收主存,3-显示主存)\n");
printf("选择功项(0~3) :");
scanf("%d",&a);
switch(a)
case 0: exit(0); /*a=0程序结束*/
case 1: /*a=1分配主存空间*/printf("输入作业名J和作业所需长度xk: ");
scanf("%*c%c%f",&J,&xk);
allocate(J,xk);/*分配主存空间*/
break;
case 2: /*a=2回收主存空间*/printf("输入要回收分区的作业名");
scanf("%*c%c",&J);reclaim(J);/*回收主存空间*/
break;
case 3: /*a=3显示主存情况*//*输出空闲区表和已分配表的内容*/
printf("输出空闲区表:\n起始地址 分区长度 标志\n");
for(i=0;i<m;i++)
printf("%6.0f%9.0f%6d\n",free_table[i].address,free_table[i].length, free_table[i].flag);
printf(" 按任意键,输出已分配区表\n");
getchar();
printf(" 输出已分配区表:\n起始地址 分区长度 标志\n");
for(i=0;i<n;i++)
if(used_table[i].flag!=0)
printf("%6.0f%9.0f%6c\n",used_table[i].address,used_table[i].length, used_table[i].flag);
else
printf("%6.0f%9.0f%6d\n",used_table[i].address,used_table[i].length, used_table[i].flag);
break;
default:printf("没有该选项\n");
/*case*/
/*while*/
/*主函数结束*/
int uflag;//分配表标志
int fflag;//空闲表标志
float uend_address;
float fend_address;
void allocate(char str,float leg)
uflag=0;fflag=0;
int k,i;float ressize;
for(i=0;i<m;i++)
if(free_table[i].flag==1 && free_table[i].length>=leg)
fflag=1;break;
if(fflag==0)
printf("没有满足条件的空闲区\n");
else
ressize=free_table[i].length-leg;
for(k=0;k<n;k++)
if(used_table[k].flag==0)
if(ressize<minisize)//剩余块过小
used_table[k].length=free_table[i].length;
used_table[k].address=free_table[i].address;
used_table[k].flag=str;
free_table[i].length=0;
free_table[i].flag=0;
break;
else
used_table[k].address=free_table[i].address+ressize;
used_table[k].flag=str;
used_table[k].length=leg;
free_table[i].length=ressize;
break;
//for结束
void reclaim(char str)
uflag=0;fflag=0;
int k,i;
for(k=0;k<n;k++)
if(used_table[k].flag==str)
uflag=1;break;
if(uflag==0)
printf("\n找不到该作业!\n");
else
for(i=0;i<m;i++)
uend_address=used_table[k].address+used_table[k].length;
fend_address=free_table[i].address+free_table[i].length;
if(used_table[k].address==fend_address)//上邻
fflag=1;
free_table[i].length=free_table[i].length+used_table[k].length;
free_table[i].flag=1;
used_table[k].flag=0;
used_table[k].length=0;
used_table[k].address=0;
printf("\n已回收!\n");
break;
else
if(free_table[i].address==uend_address)//下邻
fflag=1;
free_table[i].address=used_table[k].address;
free_table[i].length=free_table[i].length+used_table[k].length;
free_table[i].flag=1;
used_table[k].flag=0;
used_table[k].length=0;
used_table[k].address=0;
printf("\n已回收!\n");
break;
//for结束
if(fflag==0)
i=0;
for(i=0;i<m;i++)
if(free_table[i].flag==0)
free_table[i].address=used_table[k].address;
free_table[i].length=used_table[k].length;
free_table[i].flag=1;
used_table[k].length=0;
used_table[k].flag=0;
used_table[k].address=0;
break;
printf("\n已回收!\n");
本回答被提问者采纳 参考技术B 有没有具体的要求,比方说数据结构方面,我这有一个,你可以参考参考
#include"stdio.h"
#include"stdlib.h"
#define
n
10
/*假定系统允许的最大作业为n,假定模拟实验中n值为10*/
#define
m
10
/*假定系统允许的空闲区表最大为m,假定模拟实验中m值为10*/
#define
minisize
100
struct
float
address;
/*已分分区起始地址*/
float
length;
/*已分分区长度,单位为字节*/
int
flag;
/*已分配区表登记栏标志,用"0"表示空栏目*/
used_table[n];
/*已分配区表*/
struct
float
address;
/*空闲区起始地址*/
float
length;
/*空闲区长度,单位为字节*/
int
flag;
/*空闲区表登记栏标志,用"0"表示空栏目,用"1"表示未分配*/
free_table[m];
/*空闲区表*/
void
main(
)
int
i,a;
void
allocate(char
str,float
leg);//分配主存空间函数
void
reclaim(char
str);//回收主存函数
float
xk;
char
J;/*空闲分区表初始化:*/
free_table[0].address=10240;
free_table[0].length=102400;
free_table[0].flag=1;
for(i=1;i<m;i++)
free_table[i].flag=0;/*已分配表初始化:*/
for(i=0;i<n;i++)
used_table[i].flag=0;
while(1)
printf("\n选择功能项(0-退出,1-分配主存,2-回收主存,3-显示主存)\n");
printf("选择功项(0~3)
:");
scanf("%d",&a);
switch(a)
case
0:
exit(0);
/*a=0程序结束*/
case
1:
/*a=1分配主存空间*/printf("输入作业名J和作业所需长度xk:
");
scanf("%*c%c%f",&J,&xk);
allocate(J,xk);/*分配主存空间*/
break;
case
2:
/*a=2回收主存空间*/printf("输入要回收分区的作业名");
scanf("%*c%c",&J);reclaim(J);/*回收主存空间*/
break;
case
3:
/*a=3显示主存情况*//*输出空闲区表和已分配表的内容*/
printf("输出空闲区表:\n起始地址
分区长度
标志\n");
for(i=0;i<m;i++)
printf("%6.0f%9.0f%6d\n",free_table[i].address,free_table[i].length,
free_table[i].flag);
printf("
按任意键,输出已分配区表\n");
getchar();
printf("
输出已分配区表:\n起始地址
分区长度
标志\n");
for(i=0;i<n;i++)
if(used_table[i].flag!=0)
printf("%6.0f%9.0f%6c\n",used_table[i].address,used_table[i].length,
used_table[i].flag);
else
printf("%6.0f%9.0f%6d\n",used_table[i].address,used_table[i].length,
used_table[i].flag);
break;
default:printf("没有该选项\n");
/*case*/
/*while*/
/*主函数结束*/
int
uflag;//分配表标志
int
fflag;//空闲表标志
float
uend_address;
float
fend_address;
void
allocate(char
str,float
leg)
uflag=0;fflag=0;
int
k,i;float
ressize;
for(i=0;i<m;i++)
if(free_table[i].flag==1
&&
free_table[i].length>=leg)
fflag=1;break;
if(fflag==0)
printf("没有满足条件的空闲区\n");
else
ressize=free_table[i].length-leg;
for(k=0;k<n;k++)
if(used_table[k].flag==0)
if(ressize<minisize)//剩余块过小
used_table[k].length=free_table[i].length;
used_table[k].address=free_table[i].address;
used_table[k].flag=str;
free_table[i].length=0;
free_table[i].flag=0;
break;
else
used_table[k].address=free_table[i].address+ressize;
used_table[k].flag=str;
used_table[k].length=leg;
free_table[i].length=ressize;
break;
//for结束
void
reclaim(char
str)
uflag=0;fflag=0;
int
k,i;
for(k=0;k<n;k++)
if(used_table[k].flag==str)
uflag=1;break;
if(uflag==0)
printf("\n找不到该作业!\n");
else
for(i=0;i<m;i++)
uend_address=used_table[k].address+used_table[k].length;
fend_address=free_table[i].address+free_table[i].length;
if(used_table[k].address==fend_address)//上邻
fflag=1;
free_table[i].length=free_table[i].length+used_table[k].length;
free_table[i].flag=1;
used_table[k].flag=0;
used_table[k].length=0;
used_table[k].address=0;
printf("\n已回收!\n");
break;
else
if(free_table[i].address==uend_address)//下邻
fflag=1;
free_table[i].address=used_table[k].address;
free_table[i].length=free_table[i].length+used_table[k].length;
free_table[i].flag=1;
used_table[k].flag=0;
used_table[k].length=0;
used_table[k].address=0;
printf("\n已回收!\n");
break;
//for结束
if(fflag==0)
i=0;
for(i=0;i<m;i++)
if(free_table[i].flag==0)
free_table[i].address=used_table[k].address;
free_table[i].length=used_table[k].length;
free_table[i].flag=1;
used_table[k].length=0;
used_table[k].flag=0;
used_table[k].address=0;
break;
printf("\n已回收!\n");
参考技术C 问题:
1.字符串没加结束标志'\0'
2. else if(ns>=n&&nt<n)
for(i=0;i<n;i++)
m1[i]=s[i];
strcat(m1,t);
strcpy(s,m1);
这段错误
#include"iostream.h"
#include"string.h"
#include"stdio.h"
void mystrcat(char s[],char t[],int n)
char m1[100],m2[100];
int i,ns,nt;
ns=strlen(s);
nt=strlen(t);
if(ns>=n&&nt>=n)
for(i=0;i<n;i++)
m1[i]=s[i];
m2[i]=t[i];
m1[i]='\0';
m2[i]='\0';
strcat(m1,m2);
strcpy(s,m1);
else if(ns<n&&nt>=n)
for(i=0;i<n;i++)
m2[i]=t[i];
m2[i]='\0';
strcat(s,m2);
else if(ns>=n&&nt<n)
for(i=0;i<n;i++)
m1[i]=s[i];
m1[i]='\0';
strcat(m1,t);
strcpy(s,m1);
else
strcat(s,t);
void main()
char s[100],t[100];
gets(s);
gets(t);
int n;
cin>>n;
mystrcat(s,t,n);
puts(s);
参考技术D 用new 和delete进行空间的分配与收回
实验四主存空间的分配和回收
1.1. 实验目的
用高级语言完成一个主存空间的分配和回收程序,以加深对动态分区分配方式及其算法的理解。
1.2. 实验要求
采用连续分配方式之动态分区分配存储管理,使用首次适应算法、循环首次适应算法、最佳适应算法和最坏适应算法4种算法完成设计。
(1)**设计一个作业申请队列以及作业完成后的释放顺序,实现主存的分配和回收。采用分区说明表进行。
(2)或在程序运行过程,由用户指定申请与释放。
(3)设计一个空闲区说明表,以保存某时刻主存空间占用情况。把空闲区说明表的变化情况以及各作业的申请、释放情况显示。
2.实验内容
根据指定的实验课题,完成设计、编码和调试工作,完成实验报告。
3.实验环境
可以选用Visual C++作为开发环境。也可以选用Windows下的VB,CB或其他可视化环境,利用各种控件较为方便。自主选择实验环境。
4.参考数据结构:
#include<stdio.h>
#include<conio.h>
#include<string.h>
#define MAX 24
struct partition{
char pn[10];
int begin;
int size;
int end; ////////
char status; //////////
};
typedef struct partition PART;
1 #include <stdio.h> 2 #include<conio.h> 3 #include<string.h> 4 #define MAX 100 5 struct partition{ 6 char pn[10]; 7 int begin; 8 int size; 9 int end; //////// 10 char status; ////////// 11 }; 12 typedef struct partition PART; 13 PART p[MAX]; 14 int n; 15 16 int msize = 7; 17 18 void init() 19 { 20 p[0].begin = 0; 21 p[0].end = 200; 22 strcpy(p[0].pn, "SYSTEM"); 23 p[0].size = 200; 24 p[0].status = ‘u‘; 25 26 p[1].begin = 200; 27 p[1].end = 1024; 28 strcpy(p[1].pn, "-----"); 29 p[1].size = p[1].end - p[1].begin; 30 p[1].status = ‘f‘; 31 32 n = 2; 33 } 34 35 void show() 36 { 37 int x = 1; 38 39 printf("空闲区表Free:\n"); 40 printf("\tNo.\tproname\tbegin\tsize\tstatus\n"); 41 for(int i = 0; i < n; i++) 42 { 43 if(p[i].status == ‘f‘) 44 printf("\tNo.%d\t%s\t%4d\t%4d\t%4c\n", x++, p[i].pn, p[i].begin, p[i].size, p[i].status); 45 } 46 printf("\n\n=========================================================\n"); 47 48 printf("已分配分区表Used:\n"); 49 printf("\tNo.\tproname\tbegin\tsize\tstatus\n"); 50 for(i = 0, x = 1; i < n; i++) 51 { 52 if(p[i].status == ‘u‘) 53 printf("\tNo.%d\t%s\t%4d\t%4d\t%4c\n", x++, p[i].pn, p[i].begin, p[i].size, p[i].status); 54 } 55 56 printf("\n\n=========================================================\n"); 57 58 printf("内存使用情况:\nprintf sorted by address:\n"); 59 printf("\tNo.\tproname\tbegin\tsize\tstatus\n"); 60 printf("\t--------------------------------------\n"); 61 for(i = 0, x = 1; i < n; i++) 62 { 63 printf("\tNo.%d\t%s\t%4d\t%4d\t%4c\n", x++, p[i].pn, p[i].begin, p[i].size, p[i].status); 64 } 65 } 66 67 void input(char name[], int * size) 68 { 69 int x = 1; 70 71 while(x) 72 { 73 printf("\n\n请输入进程名称:"); 74 scanf("%s", name); 75 76 for(int i = 0; i < n; i++) 77 { 78 x = 0; 79 if(strcmp(name, p[i].pn) == 0) 80 { 81 x = 1; 82 printf("进程名称已存在,请重新输入!"); 83 break; 84 } 85 } 86 87 } 88 89 x = 1; 90 scanf("!!!\n"); 91 while(x) 92 { 93 printf("\n请输入进程需要的空间大小:"); 94 scanf("%d", size); 95 96 for(int i = 0; i < n; i++) 97 { 98 99 if(p[i].size >= *size) 100 { 101 x = 0; 102 break; 103 } 104 } 105 if(x) 106 printf("找不到适合的空间,请重新输入!"); 107 } 108 109 } 110 111 int show_menu() 112 { 113 int x; 114 115 printf("\n(1)首次适应算法"); 116 printf("\n(2)循环首次适应算法"); 117 printf("\n(3)最佳适应算法"); 118 printf("\n(4)最坏适应算法"); 119 printf("\n请选择一种分配方式:"); 120 scanf("%d", &x); 121 while(x < 1 || x > 4) 122 { 123 printf("\n输入错误!"); 124 printf("\n请选择一种分配方式:"); 125 scanf("%d", &x); 126 } 127 128 return x; 129 } 130 131 void first_fit(char name[], int size) 132 { 133 for(int i = 0; i < n; i++) 134 { 135 if(p[i].status == ‘f‘) 136 { 137 if(p[i].size - size < msize) 138 { 139 strcpy(p[i].pn, name); 140 p[i].status = ‘u‘; 141 break; 142 } 143 else 144 { 145 strcpy(p[n].pn, p[i].pn); 146 p[n].begin = p[i].begin + size; 147 p[n].end = p[i].end; 148 p[n].size = p[n].end - p[n].begin; 149 p[n].status = ‘f‘; 150 strcpy(p[i].pn, name); 151 p[i].end = p[i].begin + size; 152 p[i].size = size; 153 p[i].status = ‘u‘; 154 n++; 155 break; 156 } 157 } 158 } 159 160 } 161 162 void next_fit() 163 { 164 165 } 166 167 void best_fit() 168 { 169 170 } 171 172 void worst_fit() 173 { 174 175 } 176 177 void allocation() 178 { 179 char name[10]; 180 int size; 181 182 input(name, &size); 183 int x = show_menu(); 184 185 switch(x) 186 { 187 case 1: 188 first_fit(name, size); 189 break; 190 case 2: 191 next_fit(); 192 break; 193 case 3: 194 best_fit(); 195 break; 196 case 4: 197 worst_fit(); 198 break; 199 } 200 201 show(); 202 } 203 204 void move(int i, int o) 205 { 206 while(i != 0 && i < n) 207 { 208 strcpy(p[i-1].pn, p[i].pn); 209 p[i-1].begin = p[i].begin; 210 p[i-1].end = p[i].end; 211 p[i-1].size = p[i].size; 212 p[i-1].status = p[i].status; 213 } 214 n--; 215 } 216 217 void recycle() 218 { 219 char name[10]; 220 int x = 0; 221 222 printf("\n\n请输入进程名称:"); 223 scanf("%s", name); 224 225 for(int i = 0; i < n; i++) 226 { 227 if(strcmp(name, p[i].pn) == 0) 228 { 229 x = 1; 230 break; 231 } 232 } 233 if(x == 0) 234 printf("\n\n进程不存在。\n"); 235 else if(x == 1) 236 { 237 if(p[i-1].status == ‘u‘ && p[i+1].status == ‘u‘) 238 { 239 strcpy(p[i].pn, "-----"); 240 p[i].status = ‘f‘; 241 } 242 else if(p[i+1].status == ‘f‘) 243 { 244 printf("\n!!!\n"); 245 strcpy(p[i].pn, "-----"); 246 p[i].status = ‘f‘; 247 p[i].end = p[i+1].end; 248 p[i].size += p[i+1].size; 249 move(i+2, 1); 250 } 251 else if(p[i-1].status == ‘f‘) 252 { 253 p[i-1].end = p[i].end; 254 p[i-1].size += p[i].size; 255 move(i+1, 1); 256 } 257 else if(p[i-1].status == ‘f‘ && p[i+1].status == ‘f‘) 258 { 259 p[i-1].end = p[i+1].end; 260 p[i-1].size = p[i-1].size + p[i].size + p[i+1].size; 261 move(i+1, 2); 262 } 263 } 264 265 show(); 266 } 267 268 int main(void) 269 { 270 int x = 0; 271 272 printf("初始化:设置内存总容量为 1024k\n系统从低地址部分开始占用 200k\n\n"); 273 274 init(); 275 show(); 276 277 printf("\n1. 输入进程 2. 回收进程\n"); 278 scanf("%d", &x); 279 while(1) 280 { 281 if(x == 1) 282 allocation(); 283 else if(x == 2) 284 recycle(); 285 286 printf("\n1. 输入进程 2. 回收进程\n"); 287 scanf("%d", &x); 288 } 289 290 291 292 return 0; 293 }
以上是关于采用c语言实现首次适应算法完成主存空间的分配和回收 急的主要内容,如果未能解决你的问题,请参考以下文章