Perdon joder valla día.... me cagoen to lo escribo mal 10 veces igual... mira te copio el código de lo que hice y ya esta:
Código C:
Ver original/*Esta funcion sirve para eliminar un nodo de un ABB de forma recursiva:
int eliminar_nodo ( ptrNuevoArbol * ptrRaiz, int elemento ){
if ( *ptrRaiz == NULL ){
return 0;
}
else if ( (*ptrRaiz)->nodo > elemento ){
return ( eliminar_nodo ( &((*ptrRaiz)->ptrIzq), elemento ) );
}
else if ( (*ptrRaiz)->nodo < elemento ){
return ( eliminar_nodo ( &((*ptrRaiz)->ptrDrcho), elemento ) );
}
else if ( (*ptrRaiz)->nodo == elemento ){
if ( (*ptrRaiz)->ptrIzq == NULL ){
ptrNuevoArbol temp = *ptrRaiz;
*ptrRaiz = (*ptrRaiz)->ptrDrcho;
free(temp);
return 1;
}
else if ( (*ptrRaiz)->ptrDrcho == NULL ){
ptrNuevoArbol temp = *ptrRaiz;
*ptrRaiz = (*ptrRaiz)->ptrIzq;
free(temp);
return 1;
}
else{
ptrNuevoArbol aux = *ptrRaiz;
intercambiar ( ptrRaiz, &aux );
return 1;
}
}
}*/
/*void intercambiar ( ptrNuevoArbol *ptrRaiz, ptrNuevoArbol *aux ){
if ( (*ptrRaiz)->ptrIzq != NULL ){
intercambiar ( &((*ptrRaiz)->ptrIzq), aux );
}
else{
(*aux)->nodo = (*ptrRaiz)->nodo;
ptrNuevoArbol temp = *ptrRaiz;
*ptrRaiz = (*ptrRaiz)->ptrDrcho;
free (temp);
}
}*/
//Esta funcion elimina un nodo de un ABB
int eliminar_nodo ( ptrNuevoArbol * ptrRaiz, int elemento ){
ptrNuevoArbol *ptrDir = ptrRaiz;
while ( (*ptrDir)->nodo != elemento ){
if ( *ptrDir == NULL ){
return 0;
}
else if ( (*ptrDir)->nodo > elemento ){
ptrDir = &((*ptrDir)->ptrIzq);
}
else if ( (*ptrDir)->nodo < elemento ){
ptrDir = &((*ptrDir)->ptrDrcho);
}
}
if ( (*ptrDir)->ptrIzq == NULL ){
ptrNuevoArbol temp = *ptrDir;
*ptrDir = (*ptrDir)->ptrDrcho;
return 1;
}
else if ( (*ptrDir)->ptrDrcho == NULL ){
ptrNuevoArbol temp = *ptrDir;
*ptrDir = (*ptrDir)->ptrIzq;
return 1;
}
else{
ptrNuevoArbol aux = *ptrDir;
intercambiar ( ptrDir, &aux );
return 1;
}
}
/*Esta funcion intercambia el nodo de aux por el mayor del subarbol izquierdo*/
void intercambiar ( ptrNuevoArbol *ptrDir, ptrNuevoArbol *aux ){
ptrDir = &((*ptrDir)->ptrDrcho);
while ( (*ptrDir)->ptrIzq != NULL ){
ptrDir = &((*ptrDir)->ptrIzq);
}
(*aux)->nodo = (*ptrDir)->nodo;
ptrNuevoArbol temp = *ptrDir;
*ptrDir = (*ptrDir)->ptrDrcho;
}
Y no era ptrNuevoArbol ptrDir, era ptrNuevoArbol *ptrDir.
Aver si soy capaz de explicarme. Yo tengo un nodo, el cual tiene un puntero derecho y un puntero izquierdo (por definicion de la estructura ABB). Esos dos punteros (me refiero al izquierdo y al derecho) lo que almacenan es una direccion de memoria en la que se encuentra una estructura. Hasta ahí todo tiene sentido para mi. Lo que no entiendo es, al hacer &((*arbol)->ptrDrcho), que dirección hay ahí y por qué al modificar la dirección a la que apunta se modifica también la dirección a la que apunta (*arbol)->ptrDrcho
Un saludo!