📄 1.cpp
字号:
#include<stdio.h>
#include<stdlib.h>
#include<iostream.h>
#include<conio.h>
#define TOTAL 5000
#define SETADDRESS 2000
#define MIN 100
#define MAX 10
typedef struct freearea
{int address;
int size;
struct freearea *next;
struct freearea *back;
}*freeptr;
typedef struct mat
{char name;
int address;
int length;
struct mat *next;
struct mat *back;
}*jobptr;
char string[10];
long totalfree;
char jobnumber;
freeptr freep;
jobptr jobp;
init()
{freep=(freeptr)malloc(sizeof(struct freearea));
freep->size=TOTAL;
freep->address=SETADDRESS;
freep->next=NULL;
freep->back=NULL;
totalfree=TOTAL;
jobp=NULL;
return(0);
}
fengpei(int jl,char jn)
{freeptr fp;
jobptr jp,jp1,jp2;
jp2=(jobptr)malloc(sizeof(struct mat));
if(totalfree<jl) return(1);
fp=freep;
while(fp!=NULL)
{if(fp->size<jl) fp=fp->next;
else
{jobnumber=jobnumber+1;
totalfree=totalfree-jl;
jp2->name=jn;
jp2->length=jl;
jp2->address=freep->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;
/*return()*/
}
else
{fp->size=fp->size-jl;
fp->address=fp->address+jl;
}
return(2);
}
if(totalfree>=jl) return(0);
}
}
/*显示模块*/
void xianshi()
{jobptr jp;
/*清屏*/
if(jobnumber<=0) printf("NO JOB!");
else
{
printf("name\t\tlength\t\taddress\n");
jp=jobp;
while(jp!=NULL)
{
printf("%c\t\t%d\t\t%d\n",jp->name,jp->length,jp->address);
jp=jp->next;
}
}
printf("\nthe total left is %d bytes:",totalfree);
}
/******回收模块******/
void huishou(char jn)
{
freeptr fp,fp1,fp2;
jobptr jp;
int f=0;
jp=jobp;
while((jp!=NULL)&&(jp->name!=jn)) jp=jp->next;
if(jp!=NULL)
{
jobnumber=jobnumber-1;
totalfree=totalfree+jp->length;
if(free==NULL)
{
freep=(freeptr)malloc(sizeof(struct freearea));
freep->address=jp->address;
freep->size=jp->address;
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=fp1->address+fp1->size))
f=f+2;
}
else if((jp->address)=(fp1->address+fp1->size)) f=f+2;
switch(f)
{
case 0:
{
fp2=(freeptr)malloc(sizeof(struct freearea));
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;
}
}
case 1:
{
fp->size=fp->size+jp->length;
fp->address=jp->address;
}
case 2:
fp1->size=fp1->size+jp->length;
case 3:
{
fp1->size=fp1->size+jp->length+fp->size;
fp1->next=fp->next;
if(fp->next!=NULL) fp->next->back=fp2;
free(fp);
}
}
}
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);
}
}
/***********搬家**************/
void banjia()
{
freeptr fp,fp1;
jobptr jp;
long 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 mingling()
{
char name,anykey,jobname;
int length,select;
int address;
{
a1:
void clrscr();
printf("you can select one of the following\n");
printf("(1)require to be allocate\n");
printf("(2)require to collexte the size\n");
printf("(3)check the memory\n");
printf("(4)quit the system\n");
printf("you select is:");
scanf("%d",&select);
switch(select)
{ case 1:
if(jobnumber>=MAX)printf("the job is too many");
else
{
printf("enter you job name\n");
scanf("%s",&name);
printf("enter you job length\n");
scanf("%10d",&length);
address=fengpei(length,name);
switch(address)
{ case 1: printf("the memory is full");break;
case 0:
{banjia();
fengpei(length,name);
xianshi();
break;}
case 2: xianshi();break;}
break;}
case 2:
{
printf("enter the name of the job \n");
printf("you select is :");
jobname=getchar();
jobname=getchar();
huishou(jobname);
xianshi();break;
}
case 3: xianshi();break;
case 4: goto a2;
}
printf("\n press enter to return menu \n");
anykey=getchar();
anykey=getchar();
goto a1;
a2: printf("you hava exit the system!");
}
}
void main()
{
init();
mingling();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -