Newsgroup: it.comp.lang.c
Titolo: Dov'è la testa della lista?

Ciao a tutti.
Premesso: "programmo" in C da un paio di mesi :)
Serve per gestire dei tag tipo HTML da un file del tipo:
<SUN>
	<2.6>
		<banner>
		</banner>
		<postbanner>
		</postbanner>
	</2.6>
	<2.7>
	....
	</2.7>
</SUN>
Sono riuscito, con mia somma fatica, a generare una lista di questo
tipo:
struct str1 {
        char *sistema; /* primo tag */
        char *versione; /* secondo */
        char *tag; /* banner o postbanner */
        long  pos; /* posizione nel file */
        struct str1 *next;
};
typedef struct str1 strSis;
il *next punta al prossimo nodo della lista.
L'ultimo nodo ha il *next a NULL.
Da qui inizia il mio problema:
Tutto questo non č creato con una ricorsione vera e propria, in quanto
leggo il file linea per linea e (ad esempio nei primi tre casi), devo
inserire l'informazione letta nello stesso nodo della lista. Se un tag
viene chiuso allora genero un nuovo nodo e via cosě. Il mio problema č
che al termine dell'elaborazione ottengo l'indirizzo dell'ultimo nodo
e non della 'testa' della lista, che mi sarebbe molto piů utile ad
esempio per stampare  la struttura appena creata. Sono riuscito a
stampare solo all'interno della funzione che crea/inserisce info nel
nodo. Ecco un esempio del contenuto della lista:
pos		sistema		versione	tag
21      ::      SUN     ::      2.6     ::      banner
44      ::      (null)  ::      (null)  ::      postbanner103     ::  
   (null)  ::      (null)  ::      postbanner
80      ::      (null)  ::      2.7     ::      banner
103     ::      (null)  ::      (null)  ::      postbanner
per intenderci, alla fine ho l'indirizzo solo del nodo:
103     ::      (null)  ::      (null)  ::      postbanner
Come posso fare per sapere quello di:
21      ::      SUN     ::      2.6     ::      banner
? Lo salvo da qualche parte?
Se volete posso spedirvi i sorgenti per mail.
Ciao e grazie.
Paolo.


I'm not prejudiced, I hate everyone equally.

 puntatore ....
Ciao, quindi una modifica come quella qui sotto dovrebbe funzionare?
(per il momento non ho la possibilità di testarlo)
Mi chiedo però... se si tratta di un puntatore, non seguirà i
movimenti dell'oggetto puntato? (probabilemente sono congetture
insensate e frutto della mia mente malata :).
tag può contenere: "SUN" oppure "/SUN".
LstSistemi è la lista.
<CODE>
static strSis *LstSistemi;
static strSis *head;
/* Se tag inizia con / prepara per inserire un nuovo nodo */
if ( tag[0] == '/' ) 
NuovoNodo = TRUE;
else { /* inserisci il tag nella struttura */
 	if ( NuovoNodo ) /* Inserisce il tag in un nuovo nodo */
	  LstSistemi=InsTagInStruct(livello,LstSistemi->next,tag);
/* MODIFICA */
          if ( PrimoNodo ) {  /* Punt. alla testa */
              head = LstSistemi;
              PrimoNodo = FALSE;
          }
/* FINE MODIFICA */
	else /* inserisce il tag in un nodo già presente */
	  LstSistemi=InsTagInStruct(livello,LstSistemi,tag);
	NuovoNodo = FALSE;
}
</CODE>
Ecco la funzione di inserimento.
<CODE>
/* Inserisce il tag nella struttura */
strSis *
InsTagInStruct(unsigned int liv,strSis *Strutto,char *tag) {
	if (Strutto == NULL) {
		Strutto = malloc(sizeof(strSis));
		Strutto->next = NULL;
	}
	switch (liv) {
	case 0: /* nome */
		Strutto->sistema = Calloc(strlen(tag)+1,sizeof(char));
		strcpy(Strutto->sistema,tag);
	break;
	case 1: /* numero di versione */
		Strutto->versione = Calloc(strlen(tag)+1,sizeof(char));
		strcpy(Strutto->versione,tag);
	break;
	case 2: /* banner / postbanner */
		Strutto->tag = Calloc(strlen(tag)+1,sizeof(char));
		strcpy(Strutto->tag,tag);
		/* Inserisce l'attuale posizione nel file nella struct */
		Strutto->pos = ftell(Fsys);
#ifdef DEBUG
	fprintf(stderr,"%ld\t::\t%s\t::\t%s\t::\t%s\n", \
		Strutto->pos, Strutto->sistema, \
		Strutto->versione, Strutto->tag);
#endif
	break;
	} /* close switch */
	return Strutto;
}
</CODE>
Ciao e grazie.

 Ciao e grazie.
ciao ..


 deallocazione ... comunque, questo e' un fatto personale ;-)))
Grazie per il consiglio...
Ciao, Paolo.