Leyendo un arbol binario desde la consola en c

Estoy tratando de leer un árbol binario en mi progtwig usando la siguiente función que escribí.

void readTree(struct Dnode *root) { struct Dnode *temp; struct Dnode *input; char initData; scanf(" %c",&initData); input=CreateNode(initData); if(initData==122){ printf("Leaf\n"); return; } else { root=input; temp=root; printf("going to left of %c\n",initData); readTree(root->lLink); printf("going to right of %c\n",initData); readTree(root->rLink); } } 

Todo funciona bien, excepto el hecho de que, en general, el árbol no existe. Aquí está mi progtwig principal:

 int main() { int n=0; struct Dnode *root=NULL; printf("Enter the tree as it asks. Enter z whenever there is no children :\n"); readTree(root); printf("%c",root->data); printf("In main"); return; } 

El progtwig se bloquea repentinamente después de ingresar el árbol. Por favor, ayúdame.

Hay algunos problemas con su código.

1) Desea que la función cambie la raíz pero no lo hace

En la root principal hay una struct Dnode* y la función toma una struct Dnode* . Dado que C usa el paso por valor, significa que cualquier cambio realizado dentro de la función se pierde cuando la función regresa.

En otras palabras, cuando la función regresa, la root en main sigue siendo NULL . Entonces haces: printf("%c",root->data); que chatshes porque estás desreferenciado NULL .

En su lugar, la función debe tener un doble puntero, es decir, struct Dnode** . Dentro de la función debes usar *root = .... al asignar. Y la función debe ser llamada como readTree(&root);

2) Nunca guardas el nodo cuando es una hoja.

3) La temp variable nunca se usa.

4) La root nombre es confusa para una función recursiva

Juntando esto, tu código podría ser:

 void readTree(struct Dnode **current) // Double pointer { struct Dnode *input; char initData; scanf(" %c",&initData); input=CreateNode(initData); *current=input; // Save the created if(initData==122){ printf("Leaf\n"); return; } else { printf("going to left of %c\n",initData); readTree(&((*current)->lLink)); printf("going to right of %c\n",initData); readTree(&((*current)->rLink)); } } 

Desde principal lo llamamos como:

 readTree(&root); ^ notice 

Debe comprender que los valores pasados ​​a una función como argumento y el parámetro de la función evocada son los mismos, pero dos variables locales totalmente diferentes.

Cuando se evoca su función readTree (), se declara una raíz de variable local y el valor se inicia automáticamente como el mismo valor que pasó a una función cuando se evoca. La variable, raíz en main () y la raíz en readTree () son dos variables diferentes pero tienen el mismo valor.

En la función readTree (), está creando un nuevo nodo y vinculando el valor devuelto a la raíz variable en readTree (). Como escribí, las dos raíces no son idénticas. Por lo tanto, sus cambios, enlaces, no tienen efectos fuera del scope – readTree () y la raíz en main () permanece sin cambios.

Para manejar este problema, debe pasar el puntero a puntero a estructura Dnode.

Así, en función principal,

 struct Dnode *root; readTree(&root); 

y readTree () también debe ser cambiado

 readTree(struct Dnode **root)