Ciao, dal codice che hai scritto mi sembra che tu non abbia ancora ben chiari (o forse ancora devi studiarli) i vari metodi che riguardano l'inserimento in lista.
Ci sono principalmente due metodi:
1 - Il primo consiste nell'inserimento dei nodi in TESTA, cioè inserisco il primo nodo, poi il secondo, però il secondo lo inserisco in testa, quindi risulterà essere un nuovo primo nodo ecc... (Devi vederlo com se fosse una pila di libri che cade, il primo a cadere è proprio quello che poi diventerà l'ultimo, no? );
2 - Il secondo metodo consiste nell'inserimento in CODA, cioè quello consueto, quindi l'ultimo nodo che inserisco è proprio l'ultimo, il primo resta il primo, ecc...
Ora, per quanto riguarda la stampa, la funzione è corretta e resta uguale sia per l'inserimento in coda, che per quello in testa. Per quanto riguarda la funzione crea_lista, invece, ci sono un bel po' di incongruenze ed errori logici, ma questo puoi leggerlo nel codice:
(Ho usato un inserimento in TESTA, perchè è il più facile da scrivere, e non volevo confonderti le idee con quello in coda)
#include <stdio.h>
/* Includere malloc.h non serve a molto, meglio usare la libreria standard */
#include <stdlib.h>
typedef struct elemento {
char nome[20];
int v_media;
struct elemento *next;
}TipoElem; /* Meglio dare un nome diverso al tipo */
typedef TipoElem * TipoLista; /* Questo serve per definire il tipo della lista
(per non commettere errori logici ecc...) e per
rendere il codice un po' più semplice da capire */
TipoLista crea_lista (){
/* Questa funzione usa l'inserimento IN TESTA */
TipoLista listaAuto = NULL;
TipoElem *nuovo; /* Serve per creare sempre un nuovo nodo */
FILE *catalogo = fopen ("elenco_auto.txt", "r");
if (!catalogo)
printf ("Errore in apertura file!");
else {
/* Se il file non è vuoto inizio ad aggiungere le auto,
fino a quando non arrivo alla fine del file (EOF),
in pratica così il programma legge qualsiasi file
formattato in questo modo e non serve sapere il numero
di elementi contenuti... */
while (!feof(catalogo)){
nuovo = malloc (sizeof(TipoElem)); /* Alloco il nuovo elemento */
fscanf (catalogo ,"%s\n%d", nuovo->nome, &nuovo->v_media);
nuovo->next = listaAuto; /* Assegno il nodo successivo a questo come l'inizio della "vecchia" lista */
listaAuto = nuovo; /* E poi assesto la lista sul primo vero nodo, che ora è diventato
proprio questo! Ecco l'inserimento in testa... */
}
}
return listaAuto;
}
void visualizza_lista(TipoLista p)
{
/* Per stampare la lista*/
printf("lista: \n -> ");
/* Stampo la lista, però al contrario */
while(p)
{
/* Ho modificato qualcosa per ordinare la stampa */
printf("%s", p->nome);
printf(": %d\n", p->v_media);
printf(" -> ");
p = p->next;
}
printf("NULL");
return; /* Il return non dimenticarlo mai... */
}
int main()
{ /* Qualche piccolo aggiustamento */
TipoLista lista;
lista = crea_lista();
visualizza_lista(lista);
printf ("\n\nFine, ");
system ("PAUSE");
return 0;
}
Come vedi ho fatto un po' di correzioni e ho messo un po' d'ordine, ma se non hai ancora studiato gli inserimenti puoi stare tranquillo, perchè se ora ti risulta un po' estraneo, tra un po' scoprirai che alla fine le liste sono molto facili da gestire. Buona programmazione