【问题标题】:Binary Search Tree Madness二叉搜索树疯狂
【发布时间】:2014-07-20 19:20:57
【问题描述】:

我必须编写一个可以处理图书馆库存的二叉搜索树的实现。它读取包含所有书籍的文本文件,并按字母顺序将书籍添加到树中。我一直在与 DAYS 的 Insertar() 函数代码作斗争,但我无法使其正常工作,它基本上接收到与本书相关的所有数据的树根指针。如果根为 NULL,则它使用在函数中输入的所有值来初始化一个节点,并将内存方向指向该空节点。问题是,它在本地进行,最后它没有分配它。有人可以帮我纠正那个特定的功能吗?

函数和结构:

nodoArbol:节点
ArbolBin:二叉树,它有一个指向根节点的指针和一个带有元素数量的 int
InitNodo:初始化节点,返回指向节点的指针
Raiz:返回一个指向二叉树根的指针
Clear,Clear_Aux:清除一棵树
Ingresar:Insert() 函数和问题的根源
Imprimir:rints 节点的元素。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct nodoArbol {
    char nombre[51],autor[51];
    int valor,stock,anno;
    struct nodoArbol *der;
    struct nodoArbol *izq;
} tNodoArbol;

typedef struct {
    tNodoArbol *root;
    int n;
} ArbolBin;

tNodoArbol* InitNodo(char *nombre,char *autor, int stock, int valor, int anno){
    tNodoArbol *p;
    p= (tNodoArbol*)malloc(sizeof(tNodoArbol));
    strcpy(p->nombre, nombre);
    strcpy(p->autor, autor);
    p->stock = stock;
    p->anno = anno;
    p->valor = valor;
    p->izq = NULL;
    p->der = NULL;
    return p;
}

tNodoArbol* Raiz(ArbolBin p){
    return (&p)-> root;
}

void Init(ArbolBin *p){
    p->root = NULL;
    p->n = 0;
}

void clear_aux(tNodoArbol *nodo){
    if (nodo == NULL){
        return;
    }
    clear_aux(nodo->izq);
    clear_aux(nodo->der);
    free((void *) nodo);
}

void Clear(ArbolBin *p){
    clear_aux(p->root);
    p->root = NULL;
    p->n = 0;
}

void Insertar (tNodoArbol *nodo, char *nombre,char *autor, int stock, int valor, int anno){

    if (nodo == NULL){
        nodo = (InitNodo(nombre,autor,stock,valor,anno));
    }
    else{
        int result;
        result = strcmp(nodo->nombre,nombre);
        if (result>0){
            Insertar (nodo->der, nombre,autor,stock,valor,anno);
        }
        else if (result<0){
            Insertar (nodo->izq, nombre,autor,stock,valor,anno);
        }
    }
}

void Imprimir(tNodoArbol *nodo){
    printf("Nombre:%s \n",nodo->nombre);
    printf("Autor:%s \n",nodo->autor);
    printf("Stock:%d \n",nodo->stock);
    printf("Valor:%d \n",nodo->valor);
    printf("anno:%d \n",nodo->anno);
}

int main(){

char a[50]= "holi",b[50] ="asdasdasd";
ArbolBin Tree;
tNodoArbol *Root;

Init(&Tree);
Root = Raiz(Tree);
Insertar(Root,a,b,2,1000,2014);
Imprimir(Root);
return 0;
}

【问题讨论】:

    标签: c binary-search-tree


    【解决方案1】:
    tNodoArbol *Root;
    
    Insertar(Root,a,b,2,1000,2014);
    
    void Insertar (tNodoArbol *nodo, char *nombre,char *autor, int stock, int valor, int anno){
    
        if (nodo == NULL){
            nodo = (InitNodo(nombre,autor,stock,valor,anno));
        }
        else{
            int result;
            result = strcmp(nodo->nombre,nombre);
            if (result>0){
                Insertar (nodo->der, nombre,autor,stock,valor,anno);/*nodo just a pointer,node->der  is illeagl*/
            }
            else if (result<0){
                Insertar (nodo->izq, nombre,autor,stock,valor,anno);/*the same error */
            }
        }
    }
    -----------------------------------------------------------------------------------------
    your declaration a pointer, you want through the Insertar()  change the Root, you need use 
    Insertar(&Root,a,b,2,1000,2014), because the Root in the Insertar() is not the Root in the main() ,they just have the same value,we just copy the value of Root(main)  to Root(Insertar).
    ---------------------------------------------------------------------------------------
    void Insertar (tNodoArbol **nodo, char *nombre,char *autor, int stock, int valor, int anno){
    
        if (*nodo == NULL){
            *nodo = (InitNodo(nombre,autor,stock,valor,anno));
        }
        else{
            int result;
            result = strcmp((*nodo)->nombre,nombre);
            if (result>0){
                Insertar ((*nodo)->der, nombre,autor,stock,valor,anno);
            }
            else if (result<0){
                Insertar ((*nodo)->izq, nombre,autor,stock,valor,anno);
            }
        }
    }
    

    【讨论】:

    • 如果是也请说明解决方法。
    • 我们调用Insertar()函数,Insertar()函数中的“根”是形参,而main()中是实参,即使它们同名,但它们不是相同的变量,只是具有相同的值;
    • 例:int a, b = 6; a = 6; // a 和 b 具有相同的值 a = 100 ;// 改变 a 的值 b 的值仍然是 6,从未改变
    • 它没有按预期的方式工作,它确实将节点创建为“根”,但它没有在“树”中插入“根”:c
    • NVM,修复它,我是个白痴,我的 Raiz() 函数正在创建根的副本,使用双指针正确定义它修复了所有问题,谢谢!!! Fix1: tNodoArbol** Raiz(ArbolBin *p){ return &(p-> root);修复 2 (main): int main(){ char a[50]= "holi",b[50] ="asdasdasd"; ArbolBin 树; tNodoArbol *根;初始化(&树);根 = Raiz(&Tree); Insertar(根,a,b,2,1000,2014); ImprimirRaiz(&Tree);返回0; }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 2010-10-26
    • 1970-01-01
    相关资源
    最近更新 更多