结合树木和节点,价值无法进入

时间:2011-05-15 22:56:26

标签: c binary-tree

我在试验树木和节点,我遇到了麻烦。 我有

typedef struct nodo
{
    int cuenta;
    int fondo;
    struct nodo *sig;
}pNodo;
typedef pNodo *tLista;

typedef struct tree
{
    int RUT;
    struct tree *izq;
    struct tree *der;
    struct nodo *tLista;
}tTree;
typedef tTree *tABB;
typedef tTree *tNodo;

void crearArbol(tABB arbol)
{
    tABB nuevoA;
    nuevoA=(tABB)malloc(sizeof(tTree));
    arbol=nuevoA;
    arbol->izq=NULL;
    arbol->der=NULL;
}

int AgregarCuenta(tABB *arbol,int rut,int id_cuenta,int saldo)
{
    tABB AUX;
    AUX=*arbol;
    tLista nuevaC;
    int i=1;
    if(AUX==NULL)
    {
        crearArbol(AUX);
        if(id_cuenta==1)
        {
            (AUX->tLista)->fondo=saldo;
            return 0;
        }
        else
        {
            return -1;
        }
    }
    else
    {
        if(rut==AUX->RUT)
        {
            while(AUX->tLista!=NULL)
            {
                if(AUX->tLista->cuenta==id_cuenta)
                {
                    return -1;
                }
                else
                {
                    AUX->tLista=AUX->tLista->sig;
                    i++;
                }
            }
            nuevaC=(tLista)malloc(sizeof(pNodo));
            nuevaC->sig=NULL;
            nuevaC->cuenta=i;
            nuevaC->fondo=saldo;
            AUX->tLista=nuevaC;
            return 0;
        }
        else
        {
            if(rut<AUX->RUT)
            {
                AUX=AUX->izq;
                AgregarCuenta(&AUX,rut,id_cuenta,saldo);
            }
            else
            {
                AUX=AUX->der;
                AgregarCuenta(&AUX,rut,id_cuenta,saldo);
            }
        }
    }
}

int main()
{
    tABB arbolillo;
    crearArbol(arbolillo);
    AgregarCuenta(&arbolillo, 18020200, 1, 9999);

    return 0;
}

死于“(AUX-&gt; tLista) - &gt; fondo = saldo;”在AgregarCuenta功能。使用“EXC_BAD_ACCESS”

我做错了什么?

1 个答案:

答案 0 :(得分:0)

我相信crearArbol需要一个指向指针的指针作为输入:

void crearArbol(tABB *arbol)
{
    tABB nuevoA = (tABB)malloc(sizeof(tTree));
    if (nuevoA == 0)
        ...handle out of memory error...
    *arbol = nuevoA;
    (*arbol)->izq = NULL;
    (*arbol)->der = NULL;
}

电话:

crearArbol(&AUX);

否则,您不会将值“返回”到调用代码。


此外,在此之后你还有:

    if(id_cuenta==1)
    {
        (AUX->tLista)->fondo=saldo;
        return 0;
    }

但如果您刚刚调用crearArbol(),则tLista成员没有初始化,因此它指向垃圾。您需要为其指定空间,并将tLista成员设置为指向它;然后您可以设置该分配空间的fondo成员。确保初始化每个结构的每个成员......


更新1 crearArbol()中的固定表示法 - 需要额外的括号。您还必须担心crearArbol()main()的来电,我之前错过了。您遗漏了来自return的{​​{1}},或者返回类型应为AgregarCuenta(),并且该函数中的其他void语句将丢失该值。由于您没有检查返回的值,因此不清楚哪个更好。


Update 2 :此代码编译并运行。当然,它会泄漏记忆。

return

使用#include <stdlib.h> typedef struct nodo { int cuenta; int fondo; struct nodo *sig; }pNodo; typedef pNodo *tLista; typedef struct tree { int RUT; struct tree *izq; struct tree *der; struct nodo *tLista; }tTree; typedef tTree *tABB; typedef tTree *tNodo; static void crearArbol(tABB *arbol) { tABB nuevoA = (tABB)malloc(sizeof(tTree)); *arbol=nuevoA; (*arbol)->izq = NULL; (*arbol)->der = NULL; (*arbol)->tLista = malloc(sizeof(pNodo)); (*arbol)->tLista->cuenta = -1; (*arbol)->tLista->fondo = -1; (*arbol)->tLista->sig = NULL; } static int AgregarCuenta(tABB *arbol, int rut, int id_cuenta, int saldo) { tABB AUX; AUX=*arbol; tLista nuevaC; int i=1; if(AUX==NULL) { crearArbol(&AUX); if(id_cuenta==1) { (AUX->tLista)->fondo=saldo; return 0; } else { return -1; } } else { if(rut==AUX->RUT) { while(AUX->tLista!=NULL) { if(AUX->tLista->cuenta==id_cuenta) { return -1; } else { AUX->tLista=AUX->tLista->sig; i++; } } nuevaC=(tLista)malloc(sizeof(pNodo)); nuevaC->sig=NULL; nuevaC->cuenta=i; nuevaC->fondo=saldo; AUX->tLista=nuevaC; return 0; } else { if(rut<AUX->RUT) { AUX=AUX->izq; return AgregarCuenta(&AUX,rut,id_cuenta,saldo); } else { AUX=AUX->der; return AgregarCuenta(&AUX,rut,id_cuenta,saldo); } } } } int main(void) { tABB arbolillo; crearArbol(&arbolillo); AgregarCuenta(&arbolillo, 18020200, 1, 9999); return 0; } 运行时,我得到:

valgrind