Newsgroup: it.comp.lang.c
Titolo: Aiuto per semplice problema su lista !

Mi potete aiutare ?
Non riesco a capire perchè il seguente breve codice ,che implementa una
lista con operazioni di inserimento e visualizzazione ,non funziona !
Sono giorni ormai che mi ci sono bloccato sopra : ogni volta che inserisco
una parola ,questa sembra essere stata memorizzata sulla lista ,ma poi
quando visualizzo la lista  ,essa è formata da elementi tutti uguali che
corrispondono all' ultimo inserito.
Per favore aiutatemi !
Questo è il codice :
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct elemento {
 char *stringa;
   struct elemento *pun;};
struct elemento *lista;
char *parola;
int x;
struct elemento *inserisci(struct elemento *,char*);
void visualizza(struct elemento *);
main() {
lista=NULL;
parola=(char *)malloc(15*sizeof(char));
do
 {
    puts("Inserisci parola");
      scanf("%s",parola);
      lista=inserisci(lista,parola);
      puts("Vuoi continuare?(1=si)");
      scanf("%d",&x);
   }
while (x==1);
visualizza(lista);
getchar();
getchar();
}
struct elemento *inserisci(struct elemento *testa,char *p)
{
 struct elemento *temp;
   if(testa==NULL)
    {
     testa=(struct elemento *)malloc(sizeof(struct elemento));
       strcpy(testa->stringa,p);
       testa->pun=NULL;
    }
   else
    {
       temp=(struct elemento *)malloc(sizeof(struct elemento));
         strcpy(temp->stringa,p);
         temp->pun=testa;
         testa=temp;
      }
   return(testa);
}
void visualizza (struct elemento *testa)
{
 struct elemento *temp;
   temp=testa;
   if(temp==NULL) printf("\nLista Vuota");
   else
    {
       printf("\nLista-->");
         while(temp!=NULL)
          {
             printf("%s--->",temp->stringa);
               temp=temp->pun;
            }
      }
}

       strcpy(testa->stringa,p);
Il tuo programma funziona per puro caso.  
Non allochi memoria per la stringa contenuta in ogni record.
Ci tengo a precisare che queste cose si imparano su
qualsiasi manuale del linguaggio, dovresti procurartene uno.
La versione corretta e' la seguente :
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct nodo_lista_tag {
               char *s ;
               struct nodo_lista_tag *prox ;
        } *pnodo_lista ;
void inserisci( pnodo_lista *ptesta, char *p )
{
     if ( *ptesta )
     {
        inserisci( &(*ptesta)->prox, p ) ;
     }
     else
     {
        *ptesta = malloc( sizeof( **ptesta ) ) ;
        (*ptesta)->prox = 0 ;
        (*ptesta)->s = malloc( strlen( p ) + 1 ) ;
        strcpy( (*ptesta)->s, p ) ;
     }
}
void scrivi( pnodo_lista testa )
{
     for ( ; testa ; testa = testa->prox )
     {
         printf( "%s ", testa->s ) ;
     }
     printf( "\n" ) ;
}
int main()
{
    pnodo_lista testa = 0 ;
    inserisci( &testa, "The" ) ;
    inserisci( &testa, "C" ) ;
    inserisci( &testa, "language" ) ;
    inserisci( &testa, "and" ) ;
    inserisci( &testa, "its" ) ;
    inserisci( &testa, "pitfalls" ) ;
    scrivi( testa ) ;
    return 0 ;
}
--
Andrea Laforgia - walkietalkie(at)
libero.it
#exclude <windows.h>

 ha scritto nel messaggio
news:3b4935fa...@news.libero.it...


 ognuno di questi campi.
Si, se ti serve farlo.

contenente un campo puntatore a char.
I manuali non possono avere un riferimento a tutto cio' che un
programmatore puo' incontrare, pero' bisogna sforzarsi di
apprendere i concetti base e applicarli al caso specifico.

assegnato.
Non e' detto che siano esattamente 4 byte.