22/05/11 15:52
Ghost_M91W
Ragazzi ho bisogno di aiuto! In pratica ho un esercizio da svolgere, che richiede questo: dato un array di struct in input struct lista {char nome_nodo; int padre} contenenti rispettivamente il nome del nodo e l'indice del nodo padre di quel dato nodo, devo restituire in output una tabella contenente il nome del nodo, il grado (ovvero il numero dei figli) e l'indice dei figli. Tramite array non ci ho messo nulla, ma con le liste dinamiche (richiesto!) ho messo giù qualcosa, e infatti nel mio codice nome e grado vengono aggiornati, ma gli indici dei figli no!
Per farvi capire meglio, la tabella che ho in input è tipo questa:
Nome Padre
A -1(-1 indica che è il nodo radice)
B 2
C 0
D 0
Mentre in output devo restituire questa tabella:
Nome Grado Figli
A 2 3 4
B 0
C 1 2
D 0
Ripeto: il problema è negli indici dei figli: è come se non scrivessi le informazioni nella lista multipla... secondo me il problema dipende da el_da_ins ma non so come ovviare. Per favore datemi una mano, mi affido a voi.
PS: vi conviene fare copia e incolla perchè purtroppo ho perso l'indentatura
Per farvi capire meglio, la tabella che ho in input è tipo questa:
Nome Padre
A -1(-1 indica che è il nodo radice)
B 2
C 0
D 0
Mentre in output devo restituire questa tabella:
Nome Grado Figli
A 2 3 4
B 0
C 1 2
D 0
#include <stdio.h> #include <stdlib.h> #define LEN 4 struct albero{char nome_nodo; int grado; int padre; int indice; struct albero *pt_figli; struct albero *p_next; }; struct lista{char nome_nodo; int padre; }; struct coda{struct albero *info; struct coda *p_next; }; void main() {struct albero *head=calloc(1,sizeof(struct albero)),*punt=head, *radice, *p_figli, *el_da_ins, *p_albero; //puntatori per creare la lista struct coda *top, *bottom; struct albero *nodo; //puntatori per la coda per l'accesso all'albero struct lista input[]={'A',-1, 'B', 2, 'C', 0, 'D', 0, }; int i; //CARICO TUTTO L'ARRAY IN UNA LISTA// for(i=0; i<LEN; i++) {if(i<LEN-1) punt->p_next=calloc(1,sizeof(struct albero)); //evito che mi venga generato un elemento in più punt->nome_nodo=input[i].nome_nodo; punt->padre=input[i].padre; punt->indice=i; punt=punt->p_next; } punt=head; while(punt!=NULL) {if(punt->padre==-1) {radice=punt;//cerco il nodo radice printf("Radice trovata\n\n"); printf("Nome radice: %c\n",radice->nome_nodo); } else {el_da_ins=punt; p_albero=head; //scorro la lista per cercare il padre di quel nodo while(p_albero!=NULL && p_albero->indice!=el_da_ins->padre) {p_albero=p_albero->p_next; printf("Cerco...\n"); } if(p_albero->indice==el_da_ins->padre) {printf("Trovato! in posizione: %d\n",p_albero->indice); p_figli=p_albero; while(p_figli->pt_figli!=NULL) {p_figli=p_figli->pt_figli; printf("Verifica: %c\n",p_figli->nome_nodo); printf("Cerco primo nodo figlio libero\n"); } p_figli->pt_figli=el_da_ins; printf("Memoria allocata per il primo nodo figlio\n"); p_figli=p_figli->pt_figli; printf("Puntatore figli in posizione\n"); // p_figli=el_da_ins; printf("Inserisco un nodo:"); printf(" %c ",p_figli->nome_nodo); printf("di indice: %d ",p_figli->indice); printf("al padre: %c \n",p_albero->nome_nodo); p_albero->grado++; } } punt=punt->p_next; } punt=head; while(punt!=NULL) {printf("Nome: %c ",punt->nome_nodo); printf("Grado: %d ",punt->grado); p_figli=punt->pt_figli; printf("Figli: "); while(p_figli!=NULL) {printf("%c", p_figli->nome_nodo); p_figli=p_figli->pt_figli; } printf("\n\n"); punt=punt->p_next; } }
Ripeto: il problema è negli indici dei figli: è come se non scrivessi le informazioni nella lista multipla... secondo me il problema dipende da el_da_ins ma non so come ovviare. Per favore datemi una mano, mi affido a voi.
PS: vi conviene fare copia e incolla perchè purtroppo ho perso l'indentatura
Ultima modifica effettuata da Ghost_M91W 22/05/11 17:04
aaa