Я создал следующую библиотеку для вставки, удаления, поиска и печати узлов в двоичном дереве.

#include <stdlib.h>

struct NODE
{
    int code;
    char subject[20];
    struct NODE *left;
    struct NODE *right;
};


void InOrder(struct NODE *R)
{
    if (R==NULL)
    return;
    InOrder(R->left);
    printf("%d %s\n",R->code,R->subject);
    InOrder(R->right);
}

void PreOrder(struct NODE *R)
{
    if (R==NULL)
    return;
    printf("%d %s\n",R->code,R->subject);
    InOrder(R->left);
    InOrder(R->right);
}

void PostOrder(struct NODE *R)
{
    if (R==NULL)
    return;
    InOrder(R->left);
    InOrder(R->right);
    printf("%d %s\n",R->code,R->subject);
}

struct NODE *Search(struct NODE *R,int CODE,struct NODE **father)
{
    if(R==NULL)
    return NULL;
    if(R->code==CODE)
    {
        *father=R;
        return R;
    }
    if (CODE<R->code)
    return Search(R->left,CODE,father);
    else
    return Search(R->right,CODE,father);
}

struct NODE * CreateNode(struct NODE T)
{
    struct NODE *tmp;
    tmp=(struct NODE *)malloc(sizeof(T));
    *tmp=T;
    tmp->left=tmp->right=NULL;
    return tmp;
}

int Insert(struct NODE **R,struct NODE ND)
{
    struct NODE *cur,*fath=NULL;
    cur=Search(*R,ND.code,&fath);
    if (cur)
    return 0;
    cur=CreateNode(ND);
    if(fath==NULL)
    *R=cur;
    else
    if(fath->code>ND.code)
    fath->left=cur;
    else
    fath->right=cur;
    return 1;
}

struct NODE *MinOfMax (struct NODE *ND)
{
    struct NODE *tmp;
    if (ND==NULL)
    return NULL;
    if(ND->right==NULL)
    return NULL;
    tmp=ND->right;
    while(tmp->left!=NULL)
    tmp=tmp->left;
    return tmp;
}

struct NODE* Delete(struct NODE *R, int code)
{
    if (R==NULL) 
    return R;
    if (code<R->code)
    R->left=Delete(R->left,code);
    else if (code>R->code)
    R->right=Delete(R->right,code);
    else
    {
        if (R->left==NULL)
        {
            struct NODE *temp=R->right;
            free(R);
            return temp;
        }
        else if (R->right==NULL)
        {
            struct NODE *temp=R->left;
            free(R);
            return temp;
        }
        struct NODE *temp=MinOfMax(R->right);
        R->code=temp->code;
        R->right=Delete(R->right,temp->code);
    }
    return R;
}   

Когда я пытаюсь вставить узел в двоичное дерево, программа вылетает. Вот мое главное:

 int main(int argc,char* argv[])
{
    typedef struct NODE NODE;
    NODE *root=NULL;
    NODE tmp;
    Insert(&root,tmp);
    return 0;
}

Я пытался присвоить статические значения (например, code = 100 и subject = "Physics"), но программа все равно не работает. Должен ли я что-то распределить, изменить что-либо в заголовочном файле или сделать что-то совсем другое? Я застрял здесь на несколько часов без найти любое решение. Большинство функций вставки там предполагают, что у меня есть только одно целое число как данные в узле, но мне нужно пройти весь узел.

4
John M. 28 Май 2017 в 14:23

2 ответа

Лучший ответ

Ваш код в основном ничего не делает. Кажется, вы скопировали его откуда-то. Я попытался понять это, и вот пример кода. По сути, вы должны инициализировать новый узел в главном, когда вы пытаетесь вставить его. Обратите внимание, что это всего лишь пример, я не прошел полный тест.

int main(int argc,char* argv[])
{
    typedef struct NODE NODE;
    NODE *root=NULL;
    NODE *tmp = malloc(sizeof(struct NODE));
    tmp->code = 1; /*Just a number*/
    strcpy(tmp->subject,"prova"); /*Put something in it*/
    Insert(&root,*tmp); /* Try to insert it*/
    PreOrder(root); /*Try to see if it has been inserted*/
    return 0;
}
1
simo-r 28 Май 2017 в 11:51

Ваш tmp узел, который будет вновь вставленным узлом, используется неинициализированным в вашем main(). Ваш компилятор мог бы предупредить вас об этом, если бы вы использовали флаг -Wall.

Итак, давайте посмотрим на вашу функцию вставки:

int Insert(struct NODE **R, struct NODE ND)
{
    struct NODE *cur,*fath=NULL;
    cur = Search(*R, ND.code, &fath); // ND.code is junk, since ND is uninitialized
    ...
    return 1;
}

Что, вероятно, вызывает ошибку сегментации.

root тоже можно инициализировать как NULL в main().


Не причина вашей проблемы, но Я приведу результат malloc?