Newsgroup: it.comp.lang.c
Titolo: albero binario -HELP

ciao a tutti
penso di avere provato tutto quello che potevo su questo problema:
data la seguente dichiarazione:
typedef enum TipoElemento {intero, stringa, lista} TipoElemento;
typedef struct Elemento
{
  TipoElemento Tipo;
  struct Elemento *Info;
  struct Elemento *Next;
} Elemento;
typedef Elemento * Lista;
ho costruito una funzione crea() in questo modo:
Lista crea(void)                                //Crea una nuova lista
{
  Lista new=(Lista)malloc(sizeof(Elemento));
  new->Info=NULL;
  new->Next=NULL;
  return new;
}
ed il programma principale:
main()
{
    // Definizione variabili
    char line[2000];
    Lista pippo,topolino;
        printf("input1>");
        scanf("%s",line);
        pippo=crea();
        topolino=pippo;
        topolino->Info=(Lista)line;
        topolino->Next=crea();
        printf("input2>");
        scanf("%s",line);
        topolino=topolino->Next;        //passo al secondo elemento della lista
        topolino->Info=(Lista)line;
        printf("Stringa iniziale:%s\n",(char *)pippo->Info);
        printf("Stringa iniziale2:%s\n",(char *)topolino->Info);
    return 0;
}
il problema e' che io vorrei che dentro il puntatore pippo puntasse sempre 
al primo elemento della lista. Invece quando stampo pippo->Info alla fine 
del programma questo contiene l'input2.
In altre parole pippo e topolino puntano tutti e due al secondo elemento 
della lista.
Come faccio a conservare il puntatore al primo elemento della lista?
spero che siate cosi gentili da illuminarmi....
sono 4 giorni che sono fermo.
grazie
carlo

     char line[2000];
A parte che non ho ben capito come funziona la tua inizializzazione della 
lista (c'e' una sola crea, e 2 puntatori a /oggetto/ che puntano allo 
stesso, spero sia un errore di cut&paste), resta il fatto che la struttura 
in cui immagazzini i dati e' sempre la stessa (line): ottieni N oggetti che 
puntano tutti allo stesso dato (line), che sara' aggiornato all'ultima 
lettura dell'input (ovviamente :) ).
Suggerimenti:
1) crea tanti oggetti (nel tuo caso nodi della lista) quanti te ne servono, 
   sempre se il tuo non era solo un errore di cut&paste
2) dopo che hai letto l'input (in un array va' benissimo)
   a) alloca una stringa abbastanza grande da contenerlo (conta i caratteri 
      dell'array, ricordantodi di riservarne uno per il '\0', che non viene 
      conteggiato dalla strlen)
   b) copia l'array nella stringa
   c) al campo info del nodo della lista fai puntare la stringa appena 
      allocata (che sara' diversa di volta in volta)
-- 
Mox
"Trust the programmer."
"Don't prevent the programmer from doing what needs to be done."
"Keep the language small and simple."
"Provide only one way to do an operation."

 lettura dell'input (ovviamente :) ).
quindi il problema non e' nel pontatore dell'elemento della lista ma al 
puntatore del dato Info di ogni elemento della lista?
tutti gli elementi che creo (tutti gli Info) puntano sempre all'indirizzo 
della stessa stringa in memoria?
a parte queste domande credo di aver capito il problema.
grazie mille

spero che siate cosi gentili da illuminarmi....
Ho corretto i tuoi errori. Buon lavoro.
<CODE>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct elemento {
    char info[128];
    struct elemento *next;
} Elemento;
typedef Elemento *Lista;
void creaElem(Lista *);
int main()
{
    char line[128];
    Lista pippo = NULL;
    Lista topolino = NULL;
    printf("input1> ");
    fgets(line, 128, stdin);
    creaElem(&pippo);
    topolino = pippo;
    strcpy(topolino->info, line);
    printf("input2> ");
    fgets(line, 128, stdin);
    creaElem(&(topolino->next));
    topolino = topolino->next;
    strcpy(topolino->info, line);
    printf("prima stringa: %s", pippo->info);
    printf("seconda stringa: %s", topolino->info);
    return 0;
}
void creaElem(Lista *elem)
{
    (*elem) = malloc(sizeof(Elemento));
    if (*elem == NULL) {
        fprintf(stderr, "Memoria esaurita.\n");
        exit(EXIT_FAILURE);
    }
 
    (*elem)->info[0] = '\0';
    (*elem)->next = NULL;
}
</CODE>
-- 
un saluto,
    Giuseppe

 della stessa stringa in memoria?
Si, se avessi risolto il problema delle allocazioni, la situazione sarebbe 
stata esattamente cosi' :)
