Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Kinamox en 31 Mayo 2018, 05:53 am



Título: Duda Arbol
Publicado por: Kinamox en 31 Mayo 2018, 05:53 am
Hola, que tal, escribo con la finalidad de que alguien pueda decirme por que motivo no me imprime los datos ingresados, en preorden...Es como si no almacenara los valores ingresados. Espero saldar la duda, gracias de antemano.
Aqui les dejo el código para que me digan por que no almacena los datos.

Código:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

typedef struct nodo{
int dato;
struct nodo *derecha;
struct nodo *izquierda;
}TTT;

typedef TTT *pNodo;
TTT *arbol = NULL;

/*prototipo*/
TTT *crear(int);
void insertar(TTT *, int);
int preOrden(TTT *);
void menu();

main()
{

menu();

getch();
return 0;
}

/*FUNCION PARA CREAR UN NODO*/
TTT *crear(int n)
{
TTT *nuevo = (pNodo)malloc(sizeof(TTT));
printf("\n Ingresa un nodo: "); scanf("%d",&nuevo->dato);
nuevo->dato = n;
nuevo->derecha = NULL;
nuevo->izquierda = NULL;

return nuevo;
}

/* FUNCION PARA AÑADIR DATOS*/
void insertar(TTT *arbol, int n)
{
if(arbol == NULL)
{
TTT *nuevo = crear(n);
arbol = nuevo;
}
else
{
int ppp = arbol->dato;
if(n < ppp)
{
insertar(arbol->izquierda, n);
}
else
{
insertar(arbol->derecha, n);
}
}
}
/*RECORRIDO EN PREORDEN*/
int preOrden(TTT *arbol)
{
if(arbol == NULL)
{
return ;
}
else
{
printf(" %d -",arbol->dato);
preOrden(arbol->izquierda);
preOrden(arbol->derecha);
}
printf("\n\n\n");
}

//MENU
void menu()
{
int opc,x;

do{
printf("     MENU ARBOL  \n");
printf("1. Insertar nodo\n");
printf("2. PREORDEN\n");
printf("3. Salir\n");
printf("\n  Ingresa una opcion: "); scanf("%d",&opc);

switch(opc)
{
case 1: insertar(arbol,x); break;
case 2: printf("\n Recorrido en preorden: ");
preOrden(arbol); printf("\n\n\n"); break;
case 3: break;
}
system("pause");
system("cls");
}while(opc != 3);
}



Título: Re: Duda Arbol
Publicado por: srWhiteSkull en 31 Mayo 2018, 21:57 pm
El problema es que te has lanzado hacer un árbol binario sin saber mucho de punteros en C. No pases el puntero por la función porque en C es desreferenciada. Mejor retornar el puntero como haces en la función crear() o simplemente trabaja con el puntero globalmente que para eso la haz definido en ese ámbito.

Si quieres trabajar con punteros de forma más flexible y segura entonces ponte con C++  ;)

...Luego con el insertar recursivo ese ten cuidado...


Título: Re: Duda Arbol
Publicado por: MAFUS en 31 Mayo 2018, 23:13 pm
A ver que pasas x a insertar sin haberle dado valor.
Después en insertar pides el dato con scanf y después lo machacas con el valor n del argumento.
main() ¿de qué tipo es? desde el estándar C99, hace ya 19 años, que hay que definir main como int.
preOrden debe devolver un entero pero la tratas como si fuera void.
Has definido pNodo, pero no lo utilizas.

Antes de buscar dónde hay un fallo concreto quita todos los que hay, a lo mejor llegas a ver dónde está cuándo has quitado toda la paja.