Estas ante las llamadas listas enlazadas.
Este tipo de datos te permite tener X cantidad de elementos iguales (nodos) encadenados uno tras de otro.
Lo sueles utilizar cuando no sabes la cantidad de elementos que vas a tener en memoria, si lo supieras sería mejor utilizar arrays (matrices).
Respecto a la diferencia entre
ficha y
lista , ficha es el tipo de datos, y lista es un elemento de tipo ficha. De hecho tu ejemplo esta un poco rebuscado, lo más fácil de entender es algo como:
typedef
struct ficha{
char nombre[20];
struct ficha *siguiente;
};
/* ya tienes el tipo de datos, ahora creas la instancia*/
ficha lista; //creando un elemento lista de tipo ficha
En lugar de
ficha lista; se suele utilizar memoria dinámica, que es donde esta su verdadera utilidad, algo como:
lista = malloc(ficha);
así puedes crear la cantidad que quieras, las encadenas una tras otra así:
lista1->siguiente = lista2;
Para que tengas más información visita
esto
Saludos