Chiami crea_modo con un carattere, non con un puntatore a caratteri. Inoltre chiami insert che prende un carattere con un puntatore a un puntatore a carattere.
Leggi i warning che ottieni come prima cosa.
Chiami crea_modo con un carattere, non con un puntatore a caratteri. Inoltre chiami insert che prende un carattere con un puntatore a un puntatore a carattere.
Leggi i warning che ottieni come prima cosa.
"Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares
ci sono 3 warning ma quello interessante è :warning: passing argument 1 of 'crea_nodo' makes integer from pointer without a castcodice:struct Infof { char nome[12]; char telefono[10]; }; struct albero { struct Infof info; struct albero *left; struct albero *right; }; typedef struct albero bst; bst *crea_nodo(char name) { bst *nuovo = (bst *)malloc(sizeof(bst)); puts(&name); strcpy(nuovo->info.nome, &name); printf("Inserisci numero di telefono: "); scanf("%s",nuovo->info.telefono); nuovo->left = NULL; nuovo->right = NULL; return nuovo; } bst *insert(bst *padre, char *nom) { if(padre == NULL) { return crea_nodo(nom); } if(strcmp(padre->info.nome, &nom) < 0) { return insert(padre->left, nom); } else if (strcmp(padre->info.nome, &nom) > 0) { return insert(padre->right, nom); } return padre; } void preorder(bst *nodo) { if(nodo != NULL) { printf("Nome: %s\n", nodo->info.nome); printf("Numero di telefono: "); printf("%s",nodo->info.telefono); puts(""); preorder(nodo->left); preorder(nodo->right); } } int main() { bst *head = NULL; char nome[12]; printf("Inserisci nome: "); gets(nome); head = insert(head, nome); short int grado; printf("Inserisci il grado della radice: "); scanf("%hi", &grado); grado = pow(2,grado)-2; short int i; for(i = 0; i < grado; i++) { printf("Inserisci nome: "); scanf("%s", &nome); insert(head, *nome); } preorder(head); return 0; }
In insert passi a strcmp un char ** ma si aspetta un char * e passi a crea_nodo un char ma si aspetta un char *.
Inoltre se hai un variabile char c, &c non è equivalente a una stringa, una stringa è terminata da '\0'.
"Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares
il problema per adesso non è lo strcmp perché già solo se inserisco la radice e pongo il grado uguale ad 1 non mi stampa correttamente il nome della radice. Comunque ho cambiato la insert mettendo char * (stessa cosa anche a crea_nodo). Per quanto riguarda e stringhe io ho usato la gets. Se uso la scanf e guardo cosa contiene la memoria la variabile è memorizzata correttamente.
Il problema è che non hai capito come lavorano i puntatori e come è rappresentata una stringa. I tipi sono messi a caso e i problemi nel codice sono ovvi se comprendi i due aspetti di cui sopra. I punti in cui ci sono errori li ho già esposti, sono quelli e quelli rimangono, tuttavia se non capisci perché stai sbagliando è meglio se ristudi tali parti da un manuale.
Inoltre non dovresti mai sottovalutate un warning, l'unico warning accettabile è quello che ti aspetti prima di compilare la prima volta.
"Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares
non sottovaluto i warning è solo che i due successivi fanno parte di una porzione di codice non interessante. Per quanto riguarda i puntatori so come funzionano ma sto avendo problemi con le stringhe. Ho cambiato come dici tu ma non va.
codice:struct Infof { char nome[12]; char telefono[10]; }; struct albero { struct Infof info; struct albero *left; struct albero *right; }; typedef struct albero bst; bst *crea_nodo(char *name) { bst *nuovo = (bst *)malloc(sizeof(bst)); puts(&name); strcpy(nuovo->info.nome, &name); printf("Inserisci numero di telefono: "); scanf("%s",nuovo->info.telefono); nuovo->left = NULL; nuovo->right = NULL; return nuovo; } bst *insert(bst *padre, char *nom) { if(padre == NULL) { return crea_nodo(nom); } if(strcmp(padre->info.nome, &nom) < 0) { return insert(padre->left, nom); } else if (strcmp(padre->info.nome, &nom) > 0) { return insert(padre->right, nom); } return padre; } void preorder(bst *nodo) { if(nodo != NULL) { printf("Nome: %s\n", nodo->info.nome); printf("Numero di telefono: "); printf("%s",nodo->info.telefono); puts(""); preorder(nodo->left); preorder(nodo->right); } } int main() { bst *head = NULL; char nome[12]; printf("Inserisci nome: "); gets(nome); head = insert(head, &nome); short int grado; printf("Inserisci il grado della radice: "); scanf("%hi", &grado); grado = pow(2,grado)-2; short int i; for(i = 0; i < grado; i++) { printf("Inserisci nome: "); scanf("%s", &nome); insert(head, *nome); } preorder(head); return 0; }
Risolto. Mi stavo complicando la vita inutilmente