buddy算法实现
头疼,脖子疼。
#define _CRT_SECURE_NO_WARNINGS
/*
buddy算法
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct _NODE
{
int address; //内存地址
int state; //使用状态
int level; //内存块的大小
char name[10]; //内存的名称
struct _NODE *pre; //前一个结构体块
struct _NODE *next; //后一个结构体块
}NODE;
struct _NODE * all[10]; //默认的十个等级
//创建内存块,但是没用到
NODE * alloca_node(int value){
NODE* pNODE = NULL;
pNODE = (NODE*)malloc(sizeof(NODE));
memset(pNODE, 0, sizeof(NODE));
pNODE->address = -1;
pNODE->next = NULL;
pNODE->pre = NULL;
return pNODE;
}
/*从头往后删*/
void dNODE(NODE **pNODE){
NODE **pNext;
if (NULL == pNODE || NULL == *pNODE){
return;
}
pNext = *pNODE;
free(*pNODE);
dNODE(pNext);
}
//插入节点,没用到。
int insert_NODE(NODE **ppNODE, int data){
NODE * pNODE;
NODE * pIndex;
if (NULL == ppNODE){
return -1;
}
if (NULL == *ppNODE){
pNODE = alloca_node(data);
*ppNODE = pNODE;
(*ppNODE)->pre = (*ppNODE)->next = NULL;
return 1;
}
pNODE = alloca_node(data);
pIndex = *ppNODE;
while (NULL != pIndex->next){
pIndex = pIndex->next;
}
pNODE->pre = pIndex;
pNODE->next = pIndex->next;
pIndex->next = pNODE;
return 1;
}
/*
待定
*/
int delete_NODE(NODE **ppNODE, int data){
NODE * pNODE;
if (NULL == ppNODE || NULL == *ppNODE){
return -1;
}
}
//根据内存块的名称查找到响应的内存块
NODE * fNODE(char *name){
int i, j, n, m, k;
NODE * tmpNODE;
NODE * preNODE;
if (name == NULL || strlen(name) == 0){
return NULL;
}
for (i = 0; i < 10; i++){
tmpNODE = all[i];
while (tmpNODE != NULL){
if (strcmp(tmpNODE->name, name) == 0&&tmpNODE->state==1){
return tmpNODE;
}
preNODE = tmpNODE;
tmpNODE = tmpNODE->next;
}
}
return NULL;
}
//得到2的幂级数
int getMing(int base, int n){
if (n == 0){
return 1;
}
return base*getMing(base, n - 1);
}
//分配内存
int alloc_big(NODE *ppNODE,int tmpN,char *name){
NODE *tmpNODE1;
if (ppNODE == NULL||tmpN>9||tmpN<0){
return 0;
}
if (ppNODE->state == 1||ppNODE->level<tmpN){
return alloc_big(ppNODE->next, tmpN,name);
}
if (tmpN==ppNODE->level){
ppNODE->state = 1;
strcpy(ppNODE->name, name);
return 1;
}
tmpNODE1 = (NODE*)malloc(sizeof(NODE));
tmpNODE1->pre = ppNODE;
tmpNODE1->next = ppNODE->next;
tmpNODE1->address = ppNODE->address + getMing(2,ppNODE->level-1);
tmpNODE1->state = 0;
tmpNODE1->level = ppNODE->level-1;
ppNODE->next = tmpNODE1;
ppNODE->state = 0;
ppNODE->level = ppNODE->level-1;
return alloc_big(ppNODE, tmpN,name);
}
//分配内存
int alloc(int size,char*name){
int result = 1;
int tmpN ;
int n = 0, i;
NODE *p = NULL;
if (fNODE(name) != NULL){
return -1;
}
while (size /= 2)
n++;
n++;
tmpN = n;
for(;n<10;n++){
if (alloc_big(all[n],tmpN,name) == 1){
return 1;
}
/*if (all[n]->state == 0&&tmpN==n){
all[n]->state = 1;
all[n]->level = n;
all[n]->next = NULL;
all[n]->pre = NULL;
return 1;
}
else if (all[n]->state == 0){
alloc_big(all[n], tmpN);
}
else{
}
n++;*/
}
return 0;
}
//释放内存
void free_all(){
int i, j;
NODE * tmpNODE = NULL;
NODE * preNODE = NULL;
for (i = 0; i < 10; i++){
tmpNODE = all[i]->next;
while(tmpNODE!=NULL){
preNODE = tmpNODE;
tmpNODE = tmpNODE->next;
free(preNODE);
}
}
}
//为默认的内存块分配内存
void create_All(){
int i;
for (i = 0; i < 10; i++){
all[i] = (NODE*)malloc(sizeof(NODE));
}
}
//打印出所有的内存块的使用情况
void print_all(){
int i, j, n, k, m;
NODE *tmpNODE;
NODE *preNODE;
for (i = 0; i < 10; i++){
tmpNODE = all[i];
// while (tmpNODE != NULL&&tmpNODE->state==1){
while (tmpNODE != NULL){
preNODE = tmpNODE;
printf("\naddress:%d ;state:%d ;level:%d ;name:%s ;",tmpNODE->address,tmpNODE->state,tmpNODE->level,tmpNODE->name);
tmpNODE = tmpNODE->next;
printf("\n");
}
}
}
//释放某个节点
int free_NODE(char *name){
NODE * tmpNODE=fNODE(name);
NODE *preNODE = NULL;
NODE *nextNODE = NULL;
if (tmpNODE == NULL){
return -1;
}
tmpNODE->state = 0;
while (1){
preNODE = tmpNODE->pre;
nextNODE = tmpNODE->next;
if (preNODE != NULL&&nextNODE!=NULL&&preNODE->level == tmpNODE->level && preNODE->state == 0){
free(tmpNODE);
preNODE->level++;
preNODE->next = nextNODE;
nextNODE->pre = preNODE;
tmpNODE = preNODE;
preNODE = tmpNODE->pre;
}
else if (nextNODE != NULL&&nextNODE->level == tmpNODE->level && nextNODE->state == 0){
tmpNODE->next = nextNODE->next;
if (nextNODE->next != NULL){
tmpNODE->next->pre = tmpNODE;
}
free(nextNODE);
tmpNODE->level++;
}
else{
tmpNODE->state = 0;
return 1;
}
}
}
void main()
{
int i, j, m, n, k,msize=0;
char name[10];
for (i = 0; i < 10; i++){
all[i] = (NODE*)malloc(sizeof(NODE));
all[i]->address = getMing(2, i) - 1;
all[i]->state = 0;
all[i]->next = NULL;
all[i]->pre = NULL;
strcpy(all[i]->name, "");
all[i]->level = i;
}
while (1){
printf("请输入要求 1,分配;2,释放;3,结束\n");
memset(name, 0, sizeof(name));
scanf("%d", &n);
if (n == 1){
scanf("%d%s", &msize, name);
m = alloc(msize, name);
if (m==1){
printf("\n分配成功");
}
else if (m == -1){
printf("\n名字重复");
}
else{
printf("\n分配失败");
}
}else if (n == 2){
printf("输入释放名称");
scanf("%s", name);
free_NODE(name);
}
else if (n == 3){
free_all();
return;
}
print_all();
}
free_all();
return 0;
}