动态分区分配方式的模拟C语言代码和C代码Word格式.docx

上传人:b****3 文档编号:15089878 上传时间:2022-10-27 格式:DOCX 页数:24 大小:109.85KB
下载 相关 举报
动态分区分配方式的模拟C语言代码和C代码Word格式.docx_第1页
第1页 / 共24页
动态分区分配方式的模拟C语言代码和C代码Word格式.docx_第2页
第2页 / 共24页
动态分区分配方式的模拟C语言代码和C代码Word格式.docx_第3页
第3页 / 共24页
动态分区分配方式的模拟C语言代码和C代码Word格式.docx_第4页
第4页 / 共24页
动态分区分配方式的模拟C语言代码和C代码Word格式.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

动态分区分配方式的模拟C语言代码和C代码Word格式.docx

《动态分区分配方式的模拟C语言代码和C代码Word格式.docx》由会员分享,可在线阅读,更多相关《动态分区分配方式的模拟C语言代码和C代码Word格式.docx(24页珍藏版)》请在冰豆网上搜索。

动态分区分配方式的模拟C语言代码和C代码Word格式.docx

node*after;

intsize;

intaddress;

intstate;

};

nodeL;

structusenode

usenode*next;

intnum;

intadd;

}U,*n;

voidInit()//空闲分区链的初始化

node*p;

p=(node*)malloc(sizeof(node));

p->

before=&

L;

after=NULL;

size=640;

address=0;

state=0;

L.after=p;

L.before=NULL;

L.size=0;

U.next=NULL;

n=&

U;

}

node*search(inta)

node*p=L.after;

if(p==NULL)

{

printf("

没有空闲的区域!

"

);

p=NULL;

returnp;

}

else

while(p!

=NULL&

&

a>

p->

size)

p=p->

after;

if(p==NULL)

{

printf("

没有找到合适的空闲空间!

p=NULL;

returnp;

}

else

voidrecovery(inta,intb)//内存回收算法

node*c,*s,*r=L.after;

node*d=L.after,*e;

usenode*k=U.next,*h=&

while(k!

a!

=k->

num)

h=k;

k=k->

next;

if(k==NULL)

没有找到这样的作业!

h->

next=k->

if(h->

next==NULL)

n=h;

while(r!

=NULL)//若回收得到的空闲块的前方有空闲块合并此空闲块

if(k->

add==r->

address+r->

r->

size=r->

size+k->

size;

break;

r=r->

if(r==NULL)//若回收得到的空闲块的后面有空闲块合并此空闲块

r=L.after;

=NULL)

add+k->

size==r->

address)

address=k->

add;

r=r->

while(d!

=NULL)//保证空闲链表中没有相邻的空闲空间

if(d->

after!

e=d->

address+d->

size==e->

d->

after=e->

while(e->

e->

after->

before=d;

size=d->

size+e->

free(e);

d=d->

if(r==NULL)

c=(node*)malloc(sizeof(node));

c->

size=b;

if(L.after==NULL)

c->

after=L.after;

L.after=c;

{

r=L.after;

while(r!

{

if(r->

address>

c->

{

c->

after=r;

before=r->

before;

r->

before->

after=c;

before=c;

free(k);

return;

}

else

r=r->

}

free(k);

voidalloc(inta,intb)//分配内存算法

node*p,*q=L.after;

usenode*m;

p=search(b);

return;

m=(usenode*)malloc(sizeof(usenode));

//生成一个被占用链表的结点,并插入到该链表的尾部

m->

add=p->

address;

num=a;

next=n->

n->

next=m;

n=m;

//保证n始终指向被占用链表的尾部,方便以后新生成结点的插入

if(p->

size>

b)//如果申请空间的大小小于找到空闲空间的大小的处理

p->

size=p->

size-b;

address=p->

address+b;

else//如果申请空间的大小等于找到空闲空间的大小的处理

after=p->

if(p->

before=p->

free(p);

voidsort()//对空闲链表进行排序

intmax;

node*p,*q,*r,*s;

nodea;

p=L.after;

while(p!

=NULL)//让指针q指向链表的最后一个结点

q=p;

p=p->

if(L.after->

after==NULL)

return;

=q)

s=r=p=L.after;

max=r->

while(s!

=q->

after)

if(s->

max)

max=s->

r=s;

s=s->

s=s->

a.size=q->

a.address=q->

q->

address=r->

r->

size=a.size;

address=a.address;

if(q->

before==&

L)

q=q->

voidPrint()

usenode*q=U.next;

inti=1;

printf("

\n空闲区域列表:

\n"

FREEIDaddresssize\n"

%-10d"

i);

p->

address);

%d\n"

size);

i++;

if(q==NULL)

\n已分配区域列表:

WORKIDaddresssize\n"

while(q!

q->

num);

add);

voidfirstfit()//首次适应算法

inta,b,i;

Init();

Print();

while

(1)

{printf("

\n1、申请空间\n"

2、释放空间\n"

3、退出首次适应算法\n"

请输入你的选择:

scanf("

%d"

&

i);

switch(i)

case1:

请输入申请空间的作业号:

a);

请输入申请空间的大小:

b);

alloc(a,b);

Print();

case2:

请输入释放空间的作业号:

请输入释放空间的大小:

recovery(a,b);

case3:

printf("

return;

voidbestfit()

3、退出最佳适应算法\n"

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 教学研究 > 教学计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1