Buenas, pues veran, me estaba leyendo algunas explicaciones sobre Listas enlazadas, y mirando algunos ejemplos para tratar de comprender y poder hacer las mias propias, me hay algo que no entiendo, veamos:
Un ejemplo del tipo este:
struct lista
{
char *nombre;
int clave;
struct lista *sig;
};
char *nombres(int n) /*esto lo inserte yo para a ver si lo habia entendido*/
{
char *nombre[]={"Hola","Adios","Que tal","Pepe"};
return nombre[n];
}
int
main()
{
struct lista *L;
struct lista *p;
int i;
L=NULL;
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;
}
while(p!=NULL)
{
printf("\tp->nombre=%s\tp->clave = %d\n",p->nombre,p->clave);
p=p->sig;
}
Vale, ahora lo desglosamos:
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.
Siguiente fase:
int
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;
Siguiente:
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;
}
Con la variable p creamos 4 nodos: 0,1,2,3.
Le asignamos el nombre, y la clave, y hacemos que la estructura siguiente sea NULL, es decir, vacia(p->sig=L, como L es NULL)
Y lo que no entiendo es que hace:
L=p;
L apunta a NULL otra vez?
Y esto tambien me descoloca:
while(p!=NULL)
{
printf("\tp->nombre=%s\tp->clave = %d\n",p->nombre,p->clave);
p=p->sig;
}
Mientras la siguiente estructura no sea vacia, mostramos nombre y clave, pero lo que me descoloca un poco, esque va para atras, y cuando hemos creado los nodos, el que estaba vacio era el siguiente del que habiamos creado, pero aqui buscamos para atras, es decir, buscamos si el anterior esta vacio¿no? Eso no me acaba de cuadrar.
Es lo unico que no comprendo, por lo demas, llevo miradas varias paginas que encotre en google y mas o menos entiendo el concepto. Si alguien fuera tan amable de explicarmelo, se lo agradeceria.
Muchas gracias de antemano, saludos