Oppure

Loading
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

#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