采用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语言实现首次适应算法完成主存空间的分配和回收 急的主要内容,如果未能解决你的问题,请参考以下文章

操作系统——实验四:主存空间的分配和回收

实验四主存空间的分配和回收

操作系统实验四 主存空间的分配和回收

实验四 主存空间的分配和回收

《操作系统》实验报告——主存空间的分配与回收

主存空间的分配和回收实验