buddy算法实现

来源:互联网 发布:win7 python安装 编辑:程序博客网 时间:2024/05/03 20:53

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 0
原创粉丝点击