数据结构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