EDIT: Stoicenko ti ha già detto parte di quello che ti dico in questo post, ho letto solo dopo aver postato...
Beh guarda ora che rileggo il codice credo che ci sia un errore concettuale di fondo, mentre prima mi sono limitato a correggerti l'errore di compilazione senza badare al contesto... cerco di spiegarmi:
il nodo della lista è la struttura "struct el". Questa struttura ha come campi il "dato" (che sarebbe a sua volta una struttura "struct elemento" (o "el" stando alla typedef)) e un campo next, che tradizionalmente, quando si parla di liste, è un puntatore al prossimo nodo della lista stessa. A questo punto c'è l'errore concettuale di cui dicevo: il campo next dovrebbe essere un puntatore alla stessta struttura che definisce il nodo (quindi a "struct el") e non a "struct elemento" che è solo il dato della tua struttura... non so se è chiaro... dovresti modificare la tua struct el in questo modo (lasciando inalterato il resto):
codice:
struct el {
el inf;
struct el *p_next; /* puntatore al prossimo nodo, che è sempre di tipo "struct el"! */
}
fatto questo, l'assegnazione paus = paus -> p_next è più che legittima, appunto perché in tal caso i tipi coincidono (a differenza di prima).
Questo però significa pure che allora la malloc che avevi scritto originariamente (e che io ti ho corretto) andava bene, solo che c'era questo errore nella dichiarazione del campo p_next... quindi sostituisci di nuovo la chiamata a malloc con
codice:
(paus->p_next) = (struct el *) malloc(sizeof(struct el));
che è corretta (prima non lo era appunto perché avevi dichiarato male il campo "p_next" della struttura).
Ah comunque occhio che c'è un errore anche nella funzione "visualizza_vista()":
codice:
void visualizza_vista(struct el *p)
{
printf("punt_lista --->");
while (p != NULL) {
// printf ("%s %d",info.name,info.numero);
printf("--->");
p->p_next;
}
printf("NULL\n\n\n");
}
su quella riga evidenziata il gcc mi dice
ciao.c:65: warning: statement with no effect
penso non ci sia bisogno di spiegare perché :]
Comincia ad apportare queste correzioni, poi se continui ad avere problemi posta il codice corretto con i tag "code" e ci ragioniamo ancora... e resta comunque valido il consiglio di dare nomi alle strutture un po' più distinguibili, facendo però attenzione a non scombinare niente: potresti fare così:
codice:
struct dato {
char *name;
int numero;
};
typedef struct dato DATO;
struct nodo {
DATO inf;
struct nodo *p_next;
};
typedef struct nodo NODO;
E visto che mi trovo scrivendo... un'ultima cosa: nella funzione "crea_lista" cosa intendi fare con quelle strcpy? Per come hai scritto (ad esempio) la prima pare che tu voglia copiare il contenuto di "nome" in elementi[0].name, il che è sbagliato innanzitutto perché in nome non c'è niente, e poi perché il campo name della struttura è solo un puntatore, quindi avresti irrimediabilmente un segmentation fault... forse intendevi fare il contrario, cioè copiare il contenuto di elementi[0].nome in name... in quel caso gli argomenti della strcpy() vanno invertiti:
codice:
char * strcpy ( char * destination, const char * source );