elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Ingresar Registrarse
08 Septiembre 2008, 19:38  



+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderador: ®®)
| | |-+  Duda en listas enlazadas
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Imprimir
Autor Tema: Duda en listas enlazadas  (Leído 260 veces)
Leber

Desconectado Desconectado

Mensajes: 249

"Las estrellas se apagan..."


Ver Perfil
Duda en listas enlazadas
« en: 29 Marzo 2008, 14:42 »

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:

Código:
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:

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.

Siguiente fase:

Código:
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:

Código:
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:

Código:
   L=p;
L apunta a NULL otra vez?

Y esto tambien me descoloca:

Código:
   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
En línea

"Solo los tontos carecen de preucupaciones." Johann Wolfgang Goethe
Flakito81

Desconectado Desconectado

Mensajes: 332



Ver Perfil
Re: Duda en listas enlazadas
« Respuesta #1 en: 29 Marzo 2008, 15:01 »

Código
   L=p;
Estas haciendo que el principio de la lista sea el nodo que acabas de agregar, anterior a ese paso tienes
Código
p->sig=L;
y con ello estas enlazando el nuevo nodo  con la lista ya creada, al principio la lista es NULL (esta vacia) luego añades nodo 1, nodo 2, ... y te va quedando: nodo3->nodo2->nodo1->nodo0->NULL, en resumen: Reservas memoria para el nuevo nodo, das valores a los campos, haces que el nuevo nodo apunte al principio de la lista y luego haces que el nuevo nodo SEA el principio de la lista.

Como no tienes funciones y haces el listado despues de agregar y demás, p = L (por lo que te acabo de comentar), por eso te vale el siguiente codigo
Código
   while(p!=NULL)
   {
 
    printf("\tp->nombre=%s\tp->clave = %d\n",p->nombre,p->clave);
    p=p->sig;
   }
 
Aunque si intentas listar dos veces de la misma forma veras q no puedes, por ello antes del bucle se tiene q poner p = L;

Espero haber  acladado algo, un saludo!
En línea
Leber

Desconectado Desconectado

Mensajes: 249

"Las estrellas se apagan..."


Ver Perfil
Re: Duda en listas enlazadas
« Respuesta #2 en: 29 Marzo 2008, 15:13 »

Es decir con p->sig=L, estoy cargando un nuevo nodo despues de NULL, es decir, si fuera el primer bucle, estaria haciendo:

NULL
nodo1 /*primera vez que se ejecuta el bucle*/

Y con L=p, estoy haciendo que el ultimo nodo creado, se incorpore el primero, es decir, el primerod espues del valor NULL ¿no?

A ver si lo he entendido bien, muchas gracias por la explicacion Flakito
En línea

"Solo los tontos carecen de preucupaciones." Johann Wolfgang Goethe
Flakito81

Desconectado Desconectado

Mensajes: 332



Ver Perfil
Re: Duda en listas enlazadas
« Respuesta #3 en: 29 Marzo 2008, 20:36 »

Debo de estar un poco espeso. NULL no es nada e indica que la lista está vacía. Cuando añades el primer nodo haces que el puntero a la lista apunte a él (entonces la lista L deja de estar vacia), Cuando añades el nodo 2, y sucesivos, lo q haces es apuntar a  la lista ya creada ( p->sig = L) para no peder la lista y luego haces q la lista comience por el ultimo nodo añadido (L = p).

1-     L = NULL
2-     p->clave = 0; p->sig = L (lo q es lo mismo a p->sig = NULL, sólo para la primera vez)   L = p;
3-     p->clave = 1; p->sig = L (ya no es NULL, tiene un puntero al p anterior (paso2)) L = p
4- etc etc

Y te va quedando:

L= NULL

L = NODO_0->NULL

L= NODO_1->NODO_0->NULL

L= NODO_2->NODO_1->NODO_0->NULL

L= NODO_3->NODO_2->NODO_1->NODO_0->NULL

Saludos!
En línea
Leber

Desconectado Desconectado

Mensajes: 249

"Las estrellas se apagan..."


Ver Perfil
Re: Duda en listas enlazadas
« Respuesta #4 en: 03 Abril 2008, 14:49 »

Ey Flakito, que estos dias estuve algo liado y apenas pude contestar.
Solo decirte que muchas gracias por ayudarme y explicarme sobre las listas enlazadas, ya que era un tema que habia pasado por alto, y bueno, por lo que veo es algo flexible y potente(pilas, colas, listas reorganizables, doblemente enlazadas etc), con lo que ahora estoy volcadod e lleno, ya que le veo mucho juego.

Asi que sin mas, agradecerte tanto tu ayuda como el tiempo que te tomo :P

saludos ;)
En línea

"Solo los tontos carecen de preucupaciones." Johann Wolfgang Goethe
Páginas: [1] Ir Arriba Imprimir 
Ir a:  







Consolas     La Web de Goku     MilW0rm     MundoDivx

Hispabyte     Truzone     TodoReviews     ZonaPhotoshop

hard-h2o modding    Foros de ayuda    Yashira.org    Videojuegos    indetectables.net   

Noticias Informatica    Seguridad Informática    ADSL    Foros en español    eNYe Sec

Todas las webs afiliadas están libres de publicidad engañosa.

Powered by SMF 1.1.6 | SMF © 2006-2008, Simple Machines LLC