buddy算法实现

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;
}
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值