我在试验树木和节点,我遇到了麻烦。 我有
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”
我做错了什么?
答案 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