伙伴系统算法的c语言实现,数据结构c语言版 伙伴系统(Data structure, C language version, partner system).doc...

数据结构c语言版 伙伴系统(Data structure, C language version, partner system)

数据结构c语言版 伙伴系统(Data structure, C language version, partner system)

#包括<< malloc。”

#包括<

/ *

数据结构C语言版伙伴系统

8.2算法P205

编译环境:Dev-C++ 4.9.9.2

日期:2011年2月9日

* /

1024 / 2可利用空间总容量字的的幂次,子表的个数为M + 1

#定义M 10

/ /伙伴系统可利用空间表的结构

单词的结构体

{

结构词*左链域;/ /指向前驱结点

int标签;/ /块标志,0:空闲,1:占用

int kval;/ /块大小,值为2的幂次K

结构词* rlink;/ /头部域,指向后继结点

}字,头,*空间;/ /词:内存字类型,结点的第一个字也称为头

typedef struct头

{

int nodeSize;/ /该链表的空闲块的大小

结构词/孩链表的表头指针第一;

}自由列表[ M + 1 ];//表头向量类型

#定义N 100 / /占用块个数的最大值

空间R / R为整个生成空间的首地址,全局量;

/ *

8.2算法P205

用[ 0。]为可利用空间表,N为申请分配量,若有不小于N的空闲块,

则分配相应的存储块,并返回其首地址;否则返回空。

* /

Space AllocBuddy(自由列表*果,int n)

{

整数,k;

空间的PA,PI,预,成功;

/ /查找满足分配要求的子表即空闲块大小大于N的表

为(k = 0;K<= M &((*果)[K]。nodeSize<n + 1

| |!(*效用)K(第一);+ K)

如果(k)m

{

printf(“分配失败!\n”);

返回null;

}

其他/ /进行分配

{

PA =(*果)[K]。第一;/ /指向可分配子表的第一个结点

预= PA ->左链域;/ /指向前驱

成功= PA -> rlink;/ /指向后继

如果(PA = =成功)/相同的

(*果)[K]。第一= null;/ /分配后该子表变成空表

其他/ /从子表删去* PA结点(分配的)

{

预> rlink =成功;

成功>左链域=预;

(*果)[K]第一=成功;

}

/ /将块(*果)[ k ]的剩余块分成按由大到小(2的德国皇帝名称次幂)的顺序

/ /依次插入相应大小的子表中

为(i = 1;(*果)[德国皇帝名称]。nodeSize > = n + 1;+ +我)

{

PI = PA +(int)pow(2,德国皇帝名称);

rlink =ππ- >;

PI—>左链域=π;

pi =标签= 0;

PI -> kval =德国皇帝名称;

(*果)[德国皇帝名称]第一=π;

}

标签= 1;

PA -> kval = K(我);

}

返回PA;

}

/ /返回相对起始地址为P,块大小为pow(2,k)的块的伙伴地址

空间伙伴(空间P)

{

如果((P R)%(int)pow(2,P>kval + 1)= = 0)/ P为前块

返回p(int)pow(2,P>KVAL);

其他/ / P为后块

返回p(int)pow(2,P>KVAL);

}

/ /伙伴系统的回收算法将P所指的释放块回收到可利用空间表铺中

无效的回收(freelist *铺,空间* P)

{

空间;

/ /伙伴块的起始地址

s =巴迪(* P);

// printf(“回收的过程演示:\n伙伴块的起始地址:%u \n”,S);

/ /归并伙伴块,s > =研发的<< R +(* PAV)[M]。nodeSize说明伙伴块起始地

/ /址在有效范围内且伙伴块空闲

而(S>=研发的<< R +(* PAV)[M]。nodeSize & S ->标签= = 0)

{

/ /从链表上删除该结点

如果(S ->左链域= = S & S -> rlink = = S)/链表上仅此一个结点

(* PAV)[ -> kval ]。第一= null;/ /置此链表为空

其他/ /链表上不止一个结点,则将该结点的删除

{

S ->左链域-> rlink = S -> rlink;/ /前驱的后继为该结点的后继

S -> rlink ->左链域= S ->左链域;/ /后继的前驱为该结点的前驱

如果((* PAV)[ -> kval ]。第一= = S)/ /是链表的第一个结点

(* PAV)[ -> kval ]。第一= S -> rlink;/ /表头指向下一个结点

}

/ /修改结点头部

如果((* P-R)%(int)pow(2,(P)-> kval + 1)= = 0)/ P为前块

(p)-> kval + +;

其他/ / P为后块

{

S -> kval =(p)-> kval + 1;

* P = S

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值