📄 a.cpp
字号:
#include"a.h"
void initiation()
{ freep=new freeptr;
freep->size=total;
freep->address=setaddress;
freep->next=NULL;
freep->back=NULL;
totalfree=total;
jobp=NULL;
jobnumber=0;
}
//----------------------------------------
int ffallocation(int jl,char *jn)
//int jl; //作业长度
//char jn[10]; //作业名
{
int ja;
freeptr *fp;
jobptr *jp,*jp1,*jp2;
ja=-1;
if (totalfree<jl)
{ printf("can't allocation ");
return 0;
}
ja=0;
fp=freep;
while(fp!=NULL)
if (fp->size<jl)
fp=fp->next;
else
{jobnumber++;
totalfree=totalfree-jl;
jp2=new jobptr;
strcpy(jp2->name,jn);
jp2->length=jl;
jp2->address=fp->address;
ja=jp2->address;
if (jobp==NULL)
{ jp2->next=NULL;
jp2->back=NULL;
jobp=jp2;
}
else
{ jp=jobp;
while ((jp != NULL) && (jp2->address<jp->address))
{ jp1=jp;
jp=jp->next;
}
jp2->next=jp;
if (jp==NULL)
{ jp2->back=jp1;
jp1->next=jp2;
}
else
{ jp2->back=jp->back;
if (jp->back!=NULL)
jp1->next=jp2;
else jobp=jp2;
jp->back=jp2;
}
}
if (fp->size-jl<min)
{ if (fp->next!=NULL)
fp->next->back=fp->back;
if (fp->back!=NULL)
fp->back->next=fp->next;
else freep=fp->next;
}
else
{ fp->size=fp->size-jl;
fp->address=fp->address+jl;
}
return (ja);
}
}
//--------------------------------------------
void showyou()
{jobptr *jp;
if (jobnumber<0)
printf("no job\n");
else
{ printf(" name length address\n");
jp=jobp;
while (jp!=NULL)
{ printf("%11s%11d%13d\n",jp->name,jp->length,jp->address);
jp=jp->next;
}
}
printf("the total left is %d byte\n",totalfree);
}
//--------------------------------------------------
void ffcollection(char *jn)
{
freeptr *fp,*fp1,*fp2;
jobptr *jp;
int f;
jp=jobp;
f=0;
while ( (jp!=NULL) && strcmp(jp->name,jn) )
jp=jp->next;
if (jp!=NULL)
{ jobnumber--;
totalfree=totalfree+jp->length;
if (freep==NULL)
{ freep=(freeptr *)malloc(sizeof(freeptr));
freep->address=jp->address;
freep->size=jp->length;
freep->next=NULL;
freep->back=NULL;
}
else
{ fp=freep;
while ( (fp!=NULL) && (fp->address<jp->address) )
{ fp1=fp;
fp=fp->next;
}
if (fp!=NULL)
{ if ((fp->next!=NULL) && (fp->next->address==jp->address+jp->length))
f=f+1;
if ((fp->back!=NULL) && (jp->address==fp->address+fp->size))
f=f+2;
}
else
if ( jp->address==fp1->address+fp1->size )
f=f+2;
switch(f)
{ case 0:{ fp2=(freeptr *)malloc(sizeof(freeptr));
fp2->address=jp->address;
fp2->size=jp->length;
fp2->next=fp;
if (fp!=NULL)
{ fp2->back=fp->back;
if (fp->back!=NULL)
fp1->next=fp2;
else
freep=fp2;
fp->back =fp2;
}
else
{ fp2->back=fp1;
fp1->next=fp2;
}
break;
}
case 1:{fp->size=fp->size+jp->length;
fp->address=jp->address; break;
}
case 2: { fp1->size=fp->size+jp->length; break;
}
case 3:{ fp->size=fp1->size+jp->length+fp->size;
fp1->next=fp->next;
if(fp->next!=NULL)
{ fp->next->back=fp2; free(fp);
}
break;
}
}
}
if (jp==jobp) jobp=jp->next;
if (jp->next!=NULL) jp->next->back=jp->back;
if (jp->back!=NULL) jp->back->next=jp->next;
free(jp);
}
if (!(strcmp(jp->name,jn)))
printf("cant't find %s,so can't collect %s",jn,jn);
}
//---------------------------------------------------
void coalesce()
{ freeptr *fp,*fp1;
jobptr *jp; int bottom;
if (jobnumber>0)
{ jp=jobp;
bottom=total+setaddress;
while (jp!=NULL)
{ jp->address=bottom-jp->length;
bottom=bottom-jp->length;
jp=jp->next;
}
fp=freep;
while (fp!=NULL)
{ fp1=fp; fp=fp->next; free(fp1);
}
freep=(freeptr *)malloc(sizeof(freeptr));
freep->size=totalfree;
freep->address=setaddress;
freep->next=NULL;
freep->back=NULL;
}
}
//-------------------------------------------------------------------------
void menu()
{ char name[10]; int length,address; int select=0;
while (select!=4)
{ system("cls");
printf("\n");
printf(" ************ memory management program **********\n");
printf("\n");
printf("\n");
printf(" you can select one of the following:\n" );
printf("____________________________________________________\n");
printf(" (1) require to be allocate.\n");
printf(" (2) require to collecte the size.\n");
printf(" (3) check the memory.\n");
printf(" (4) quit.\n"); printf("____________________________________________________\n");
printf("\n");
printf("\n");
printf(" which would you select ? please inpute 1,2,3,4.\n");
scanf("%d",&select);
while ( (select!=1) && (select!=2) && (select!=3) && (select!=4) )
scanf("%d",&select);
switch(select)
{ case 1: { if ( jobnumber>max ) printf("the job is too many.\n");
else
{ printf("enter you job name:\n"); scanf("%s",name);
printf("enter you job length:\n"); scanf("%d",&length);
address=ffallocation(length,name);
switch(address)
{ case -1: printf("the momory is full.\n"); break;
case 0: { coalesce();
ffallocation(length,name);
showyou();break;
}
default: showyou();break;
}
}
char c;
scanf("%c",&c);
break;
}
case 2: { printf("\nenter the name of the job want to collect the size:\n");
scanf("%s",name);
ffcollection(name);
showyou();
char c;
scanf("%c",&c);
break;
}
case 3: { showyou();
char c;
scanf("%c",&c);
break;
}
case 4: exit(1);break;
}
}
}
void main()
{
initiation();
menu();
char c;
scanf("%c",&c);
}
//----------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -