C 二叉搜索树疯狂

C 二叉搜索树疯狂,c,binary-search-tree,C,Binary Search Tree,我必须编写一个二进制搜索树的实现,它可以处理图书馆的库存。它读取包含所有书籍的文本文件,并按字母顺序将书籍添加到树中。我已经和Insertar()函数代码斗争了好几天,但我无法使它正常工作,它基本上接收到一个指向树根的指针以及与本书相关的所有数据。如果根为NULL,则它使用函数中输入的所有值初始化一个节点,并将内存方向设置为NULL节点。问题是,它是在本地进行的,但最终它没有分配它。有人能帮我纠正一下那个特殊的功能吗 功能和结构: nodoArbol:节点 ArbolBin:二叉树,它有一个指向

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

功能和结构:

nodoArbol:节点
ArbolBin:二叉树,它有一个指向根节点的指针和一个包含元素数的int
InitNodo:初始化节点,返回指向节点的指针
Raiz:返回指向二叉树根的指针
清除,清除\辅助:清除树
Ingrear:Insert()函数和问题的根源
Imprimir:打印节点的元素

#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;
}
#包括
#包括
#包括
typedef结构nodoArbol{
字符名称[51],自动编号[51];
int valor,股票,anno;
结构nodoArbol*der;
结构nodoArbol*izq;
}三硝基苯酚;
类型定义结构{
三硝基苯酚*根;
int n;
}阿尔伯宾;
tNODARBOL*InitNodo(字符*nombre,字符*autor,整数库存,整数价值,整数anno){
三硝基苯酚*p;
p=(三硝基苯酚*)马洛克(三硝基苯酚的大小);
strcpy(p->nombre,nombre);
strcpy(p->autor,autor);
p->库存=库存;
p->anno=anno;
p->valor=valor;
p->izq=NULL;
p->der=NULL;
返回p;
}
Tnodabol*Raiz(阿尔宾p){
返回(&p)->根目录;
}
void Init(ArbolBin*p){
p->root=NULL;
p->n=0;
}
无效清除辅助(tNODARBOL*nodo){
if(nodo==NULL){
返回;
}
清除辅助(nodo->izq);
清除辅助(节点->顺序);
自由((void*)nodo);
}
空隙清除(阿尔伯宾*p){
清除辅助(p->root);
p->root=NULL;
p->n=0;
}
void Insertar(tnodarbol*nodo,char*nombre,char*autor,int stock,int valor,int anno){
if(nodo==NULL){
nodo=(InitNodo(nombre,autor,stock,valor,anno));
}
否则{
int结果;
结果=strcmp(nodo->nombre,nombre);
如果(结果>0){
插入器(nodo->der,nombre,autor,stock,valor,anno);
}
否则如果(结果、名义、自动、股票、价值、anno);
}
}
}
无效票据(三硝基苯酚*nodo){
printf(“Nombre:%s\n”,nodo->Nombre);
printf(“自动:%s\n”,nodo->Autor);
printf(“库存:%d\n”,节点->库存);
printf(“价值:%d\n”,nodo->Valor);
printf(“anno:%d\n”,nodo->anno);
}
int main(){
字符a[50]=“holi”,b[50]=“asdasdasd”;
栓皮树;
三硝基苯酚*根;
初始化(&树);
根=Raiz(树);
插入器(根,a,b,210002014);
Imprimir(根);
返回0;
}
tNODARBOL*根;
插入器(根,a,b,210002014);
void Insertar(tnodarbol*nodo,char*nombre,char*autor,int stock,int valor,int anno){
if(nodo==NULL){
nodo=(InitNodo(nombre,autor,stock,valor,anno));
}
否则{
int结果;
结果=strcmp(nodo->nombre,nombre);
如果(结果>0){
插入符(nodo->der,nombre,autor,stock,valor,anno);/*nodo只是一个指针,node->der是非法的*/
}
else if(resultizq、nombre、autor、stock、valor、anno);/*相同的错误*/
}
}
}
-----------------------------------------------------------------------------------------
您的声明是一个指针,您需要通过Insertar()更改根,您需要使用
Insertar(&Root,a,b,210002014),因为Insertar()中的根不是main()中的根,它们只有相同的值,所以我们只需将Root(main)的值复制到Root(Insertar)。
---------------------------------------------------------------------------------------
无效插入符(t NODARBOL**nodo、char*nombre、char*autor、int stock、int valor、int anno){
如果(*nodo==NULL){
*nodo=(InitNodo(nombre,autor,stock,valor,anno));
}
否则{
int结果;
结果=strcmp((*nodo)->nombre,nombre);
如果(结果>0){
插入符((*nodo)->der、nombre、autor、stock、valor、anno);
}
否则如果(结果、名义、自动、股票、价值、anno);
}
}
}

如果是,请解释解决方案。我们调用函数Insertar(),函数Insertar()中的“根”是形式参数,而在main()中,它是实际参数,即使它们具有相同的名称,但它们不是相同的变量,只是具有相同的值;Exa:inta,b=6;a=6;//a和b具有相同的值a=100//更改a的值b的值仍然是6,never changedIt不按预期方式工作,它肯定会将节点创建为“根”,但不会在“树”中插入“根”:cNVM,修复了它,我是个白痴我的Raiz()函数正在创建根的副本,使用双指针并正确定义它修复了所有问题,谢谢!!!Fix1:tnodarbol**Raiz(ArbolBin*p){return&(p->root);}fix2(main):intmain(){chara[50]=“holi”,b[50]=“asdasdasd”;ArbolBin树;tnodarbol*root;Init(&Tree);root=Raiz(&Tree);Insertar(root,a,b,210002014);ImprimirRaiz(&Tree);return 0;}
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);
        }
    }
}