non so che dire.. nel main provo a testare l'albero e i nodi ci sono correttamente e riesco ad accederci..
ma nella funzione nella quale mi serve di accedere a quei nodi figli, non riesco..
non so che dire.. nel main provo a testare l'albero e i nodi ci sono correttamente e riesco ad accederci..
ma nella funzione nella quale mi serve di accedere a quei nodi figli, non riesco..
Ma riesci a trovare tutti i passi che ti ho mostrato nel programma d'esempio, nel tuo programma?
Ovvero, mi mostri come crei il nodo root?
Mi mostri come crei la lista NodoLista e come la agganci al nodo root?
Mi mostri come crei il nodo che agganci alla lista appena creata?
E come crei la stringa relativa al nodo suddetto?
cerco di risponderti ma non è cosi facile..perche nel porre la questione ho un po semplificato il tutto..visto che ci sono in mezzo 5-6 file.. uno per le strtture list, uno per quelle node, con relative funzioni che creano liste, nodi...etc
cmq nel main attuale:
dove le funzioni new_text_node e new_tag_node sono funzioni che appunto creano nodi:codice:int err; node t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12; // t1 è la radice char *query1,*query2,*query3; list lista_query,risultato; int radice; err = new_list(&lista_query); err = new_list(&risultato); // costruzione albero di prova input err = new_tag_node(&t1, "libro"); err = new_tag_node(&t2, "categoria"); err = new_text_node(&t3, "giallo"); err = new_text_node(&t4, "romanzo"); err = new_tag_node(&t5, "autore"); err = new_tag_node(&t6, "nome"); err = new_tag_node(&t7, "nome"); err = new_text_node(&t8, "wilbur"); err = new_text_node(&t9, "smith"); err = new_text_node(&t10, "\n"); err = new_text_node(&t11, "\n"); err = new_text_node(&t12, "\n"); err = add_child(t1, t10); err = add_child(t1, t2); err = add_child(t1, t11); err = add_child(t1, t5); err = add_child(t1, t12); err = add_child(t2, t3); err = add_child(t2, t4); err = add_child(t5, t6); err = add_child(t5, t7); err = add_child(t6, t8); err = add_child(t7, t9);
e la add_child:codice:int new_text_node(node *n, char *text) { /* crea un nuovo nodo di tipo text */ node t = malloc(sizeof(struct node)); t->name = (char *)malloc(sizeof(char) * strlen(text) + 1); if (t->name == NULL) return OP_MEM_ERROR; // errore: mem non allocata strcpy(t->name,text); t->type = TEXT_NODE; int a = new_list(&t->children); a = new_list(&t->attributes); *n = t; return OP_OK; } int new_tag_node(node *n, char *text) { /* crea un nuovo nodo di tipo tag */ node t = malloc(sizeof(struct node)); t->name = (char *)malloc(sizeof(char) * strlen(text) + 1); if (t->name == NULL) return OP_MEM_ERROR; // errore: mem non allocata strcpy(t->name,text); t->type = TAG_NODE; int a = new_list(&t->children); a = new_list(&t->attributes); *n = t; return OP_OK; }
codice:int add_child(node parent,node child) { if ((!parent) || (!child)) return OP_GENERIC; int a; a = add_last(&parent->children,&child); return 0; }
sono passato a win e non ho piu i file sotto mano cmq la new_list in pratica creava un nuovo elemento list e lo metteva a NULL mi pare..
cmq quste funzioni dovrebbero andare bene perche hanno superato svariati test precedenti e hanno sempre funzionato..
sono alla disperazione!![]()
![]()
Senti ... io sto provando il tuo codice e mi manca la new_list ...
Capisco che tu l'hai provato, ma c'e' un errore e se non mi dai il sorgente non posso provare a capire dov'e' ...
Quindi, disperarsi non serve a nulla ... se mi dai la funzione che ti ho chiesto, faccio le prove e ti faccio sapere ... altrimenti, non so cosa dirti ...
P.S. Manca anche la add_last
ok ritornato inlinux..
grazie per l'aiuto e la pazienza..codice:int new_list(list *l) { /* crea una nuova lista vuota */ *l = NULL; return OP_OK; }
codice:int add_first(list *l, void *el) { /* inserisce l'elemento el in testa alla lista l */ if (!el) return OP_NO_ATTRIBUTE_ERROR; list t; t=malloc(sizeof(struct NodoLista)); if (!t) return OP_MEM_ERROR; t->value=el; t->next=*l; *l=t; return OP_OK; } int add_last(list *l, void *el) { /* inserisce l'elemento el in coda alla lista l */ if (!el) return OP_NO_ATTRIBUTE_ERROR; list t; if (*l == NULL) { // lista vuota *l=malloc(sizeof(struct NodoLista)); (*l)->value=el; (*l)->next=NULL; return OP_OK; } t = *l; // c'è almeno 1 el while (t->next != NULL) t = t->next; t->next=malloc(sizeof(struct NodoLista)); if (!t) return OP_MEM_ERROR; t=t->next; t->value=el; t->next=NULL; return OP_OK; }
Per come e' fatta la add_last allora devi chiamarla cosi' nella add_child
... ovvero child e' gia' un puntatore, non devi passare un puntatore a puntatore ...codice:int add_child(node parent, node child) { if ((!parent) || (!child)) return 2; //OP_GENERIC; int a = add_last(&parent->children, child); return 0; }