Cita: Vayamos por partes:
Código: struct lista
{
char *nombre;
int clave;
struct lista *sig;
};
Una estructura con un apuntador a caracter, un entero, y un apuntador a la misma estructura. Corrijanme si me equivoco.
Es un apuntador a una estructura del mismo tipo, no a ella misma, si se quiere que apunte a si misma eso se haría después aunque no tendría mucho sentido.
Cita: main()
{
struct lista *L;
struct lista *p;
int i;
L=NULL;
Definimos una varible auxiliar "p", que sera la encargada de crear mas nodos, y creamos la lista vacia con L=NULL;
Recuerda que L y p son apuntadores a un tipo en especifico, aqui ambos son apuntadores a una estructura de tipo lista, p aun no han sido referenciada y L se referencia a nulo.
Cita: for(i=0;i<4;i++)
{
p=(struct lista *)malloc(sizeof(struct lista));
p->nombre=nombres(i);
p->clave=i;
p->sig=L;
L=p;
}
Genera el nodo, y sí, la primera vez L es NULL por lo que en el primer nodo el apuntador al siguiente nodo es nulo. Esta situacion cambia en la segunda iteración ya que L ya tiene un valor, por lo que se genera un nuevo nodo y el apuntador al siguiente nodo lo mandas a L y despúes lo mandas al inicio de la lista. Con esto L apuntará al primer nodo de la lista.
Lo unico es que el llenado de esta lista es como una pila (LIFO)
Espero poder ponerlo claro. Considerando que ◙ son los nodos creados
Código:
Incio del prog
p undefined
L NULL
1a iteraciòn
Al crear el nodo tenemos
p->◙
L ->NULL
Al ejecutar
p->sig=L;
p->◙->NULL
Al ejecutar
L=p;
L->◙->NULL
2a iteraciòn
Al crear el nodo tenemos
p->◙
L ->◙->NULL
Al ejecutar
p->sig=L;
p->◙->L->◙->NULL
Al ejecutar
L=p;
L->◙->◙->NULL
3a iteraciòn
Al crear el nodo tenemos
p->◙
L ->◙->◙->NULL
Al ejecutar
p->sig=L;
p->◙->L->◙->◙->NULL
Al ejecutar
L=p;
L->◙->◙->◙->NULL
Espero haber sido claro...