AVL TREE Malloc Функция при вставке нового узла - PullRequest
0 голосов
/ 29 июня 2018

Я недавно успешно создал BST в C .. Тогда моя попытка была создать AVL .. Первый шаг в этом. Мы должны были добавить дополнительные Компонент BF (коэффициент баланса) в каждом узле .. Я сделал это следующим образом.

    struct tnode{
        int info;
        struct tnode*left;
        struct tnode*right;
        int bf;//new field for avl tree..
                };

Каждый раз, когда malloc назначает адрес новому узлу во время вставки ... Я назначаю его информационную часть значение, введенное пользователем ... установите левый и правый указатель на NULL. В дополнение к этому он назначает bf нового узла в 0 .. После вставки первого узла (то есть корневого узла) программа завершится неудачно в части malloc в следующий раз даже назначить память для нового узла ... Как только я удаляю часть, которая говорит newnode-> bf = 0 .. Проблема исчезает .. Почему это происходит? Ниже приведена моя основная функция и функция add (), которая принимает целое число в качестве входных данных и вставляет его в дерево с корневым узлом как root, объявленным глобально.

    int main(){
    int choice,val;
    deci:
    printf("\n1.Insert");
    printf("\n2.Display");
    printf("\n3.Search.");
    printf("\n4.Delete");
    printf("\n5.Naa..");
    scanf("%d",&choice);
    switch(choice){
            case 1:printf("\nEnter element to add:");
                    scanf("%d",&val);
                    add(val);

                    //display();
                    break;
            case 2:display();
                    break;
            case 3:printf("\nEnter element to search for:");
                    scanf("%d",&val);
                    search(val);
                    break;

            case 4:printf("\nEnter element to Delete: ");
                    scanf("%d",&val);
                    deletei(val);
                    display();
                    break;
            case 5:return 0;

            }
    goto deci;
    return 0;
    }


    void add(int val){
    struct tnode * newnode=(struct tnode * )malloc(sizeof(struct tnode *));
    newnode->info=val;
    newnode->left=newnode->right=NULL;
    newnode->bf=0;//problem making,problem solved removing this statement
    if(root==NULL){
            root=newnode;

                    }                       
    else{
        struct tnode*tree=root;
        struct tnode*ptree=NULL;
    while(tree!=NULL){
                    if(val<tree->info){
                                        ptree=tree;
                                        tree=tree->left;

                    }
                    else{
                        ptree=tree;
                        tree=tree->right;
                    }                       


        }   
    if(val<ptree->info){

                ptree->left=newnode;
                tree=ptree->left;


        }
else{
ptree->right=newnode;   
tree=ptree->right;

    }
    }


    }   

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

Ваша проблема в этой строке:

struct tnode * newnode = (struct tnode *) malloc(sizeof(struct tnode *))

Из C ссылки для malloc

Распределяет байты размера неинициализированного хранилища.

Если выделение выполнено успешно, возвращает указатель на младший (первый) байт в выделенном блоке памяти

То есть malloc выделяет блок памяти и возвращает указатель на начало этого блока. Аргумент malloc - это размер блока памяти, который вы хотите выделить.

В вашем случае вы передаете sizeof(struct tnode *). Таким образом, вы выделяете достаточно памяти для указателя на значение типа struct tnode. Если вы хотите выделить память для самого struct tnode, измените sizeof на sizeof(struct tnode). Тогда фиксированная линия должна выглядеть как

struct tnode * newnode = (struct tnode *) malloc(sizeof(struct tnode))
0 голосов
/ 29 июня 2018

Ваша первая главная ошибка заключается в том, что вы выделяете место только для адреса для newnode in add(). Вы должны преобразовать его в:

struct tnode * newnode=(struct tnode * )malloc(sizeof(struct tnode));

В этом случае вы выделяете все пространство для требуемого узла.

PS. Пожалуйста, также откажитесь от инструкции 'goto', так как это плохая практика.

...