elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [C] Listas enlazadas utilizando arreglos
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: 1 [2] Ir Abajo Respuesta Imprimir
Autor Tema: [C] Listas enlazadas utilizando arreglos  (Leído 8,597 veces)
MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: [C] Listas enlazadas utilizando arreglos
« Respuesta #10 en: 6 Mayo 2016, 18:39 pm »

La premisa para que funcione la función es que la lista siempre debe estar terminada con NULL. Si está vacía debe estar apuntando a NULL.

La función pondrá el nodo generado con el dato al final de la lista. Siguiendo la primera premisa éste último nodo debe apuntar a NULL en next.

Lo que se hace es:
Se genera un nodo a partir de la información dada por data.

Si la lista está vacía, NULL, pasará a apuntar al nodo nuevo.
Si la lista no está vacía hay que recorrerla hasta encontrar el último elemento (aquel que apunte a NULL), cambiar el valor next para que apunte al nuevo nodo generado y regresar la lista entera, eso es el primer elemento (list).

Lo que ves en
Código
  1. while (slist_next(node) != slist_nil()) {
  2.    node = slist_next(node);
es precisamente ese recorrido. node apunta al principio de la lista (list) y vamos a trabajar sobre node. Mientras el elemento next de node no sea NULL, node apuntará a node->next (en el código esto está encapsulado por node = slist_next(node). Una vez llegado a éste último elemento la orden list_next(node) = newNode; coloca el nuevo nodo al final de la lista.
Como el inicio de la lista no ha sido modificado (list) y hay que regresar un puntero, precisamente al inicio de la lista, devolvemos list.

Otra versión sin estas macros es así:
Código
  1. SList slist_append(SList list, int data) {
  2.    Slist node;
  3.    SList newNode = malloc(sizeof(SNode));
  4.  
  5.    newNode->data = data;
  6.    newNode->next = NULL;
  7.  
  8.    if(list == NULL)
  9.        return newNode;
  10.  
  11.    node = list;
  12.  
  13.    while(node->next != NULL)
  14.        node = node->next;
  15.  
  16.    node->next = newNode;
  17.  
  18.    return list;
  19. }


En línea

GGZ

Desconectado Desconectado

Mensajes: 144



Ver Perfil
Re: [C] Listas enlazadas utilizando arreglos
« Respuesta #11 en: 7 Mayo 2016, 03:27 am »

Me explicaste todo lo que yo ya sabía, se como trabaja la función se lo que hace, pero no entiendo como la enlaza o sea como relaciona list con node, eso es lo que no entiendo.

O sea como que yo modifico node y también se modifica list si nunca lo relacioné sólo dije node = list (pero acá no estoy cambiando ningún valor de list) y nada más.


ENTIENDO TODO LO QUE HACE LA FUNCIÓN, LO QUE NO ENTIENDO ES PORQUE RETORNA LIST SI NUNCA LO TOCA SI NUNCA LO MODIFICA A LIST, NUNCA DICE "EL SIGUIENTE ELEMENTO DE LIST APUNTA AL NODE"


« Última modificación: 7 Mayo 2016, 03:34 am por nisteeklod » En línea

LET'S DO STUFF!!
MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: [C] Listas enlazadas utilizando arreglos
« Respuesta #12 en: 7 Mayo 2016, 05:08 am »

A ver si me se explicar ahora:
node es una variable puntero auxiliar. Su única función es, junto al while, encontrar el último nodo de la lista.
La variable list no se toca, es el inicio de la lista, lo que hay que regresar. Pero la lista sí que se ha modificado, ha crecido en un elemento.

node = list; es porqué la lista es un dato dinámico y no sabemos que extensión tiene pero sabemos que list, al menos, tiene un nodo válido y que ése es el primero; por tanto hay que empezar a buscar el último nodo de la lista por el primero y recorrerla hasta llegar al final.

A ver si me salen los dibujitos esquemáticos:

Código:

XXXXXXXXX <- Esto es nuestra lista

y como toda lista enlazada tiene un puntero apuntando a su cabeza

list
v
XXXXXXXXX



Y <- elemento nuevo que se debe colocar a la lista

como list no se puede tocar, que es lo que hay que regresar nos inventamos node

list
v
XXXXXXXXX      <- esto es node = list
^
node


Y <- por simplicidad lo dejaré perdido por el limbo hasta que lo coloque

ahora node debe encontrar el último elemento

list
v
XXXXXXXXX
 ^
 node

list
v
XXXXXXXXX
  ^
  node

list
v
XXXXXXXXX
   ^
   node

...

list
v
XXXXXXXXX
        ^
        node

Ahora el next de node, que es exactamente lo mismo al next del último elemento enlaza a Y y virtualmente obtenemos lo siguiente

list
v
XXXXXXXXXY

node, ya no me sirve y lo dejo tranquilo. Desaparecerá cuándo desaparezca la función ya que es una variable local.

La lista se queda ya que es algo que hay en el motón y por tanto permanente.

Debo retornar list porqué apunta a la lista modificada.

Ahora me puedes decir: pero si list tiene la misma posición de memoria al principio de la función que al final, no se ha modificado en nada el valor que guarda, no hace falta devolverla.

Y te digo: sí que hace falta porqué también sirve la función para generar la lista desde cero. Si se le pasa list=NULL a la función ocurre lo siguiente:
Código:

list
v
NULL

genero un dato

list
v
NULL

X <- el dato

y enlazo list con el dato

list
v
X


Ahora si no devuelvo list fuera de la función no existiría esta modificación.
« Última modificación: 7 Mayo 2016, 05:21 am por MAFUS » En línea

GGZ

Desconectado Desconectado

Mensajes: 144



Ver Perfil
Re: [C] Listas enlazadas utilizando arreglos
« Respuesta #13 en: 7 Mayo 2016, 16:05 pm »

Lo que yo no entiendo es este paso:

Código:
list
v
XXXXXXXXX
        ^
        node

Ahora el next de node, que es exactamente lo mismo al next del último elemento enlaza a Y y virtualmente obtenemos lo siguiente

list
v
XXXXXXXXXY

Ya sé que el next de node es el ÚLTIMO elemento ya sé eso, pero no sé como lo enlaza capaz no entendí bien la definición de las estructuras o sea yo tenía entendido que se debe poner CUAL ES EL SIGUIENTE elemento.

Es decir uno define node y busca hasta el último elemento y luego lo enlaza con newNode PERFECTO! ESO SE ENTIENDE.

La pregunta es: ¿cuando enlaza list con node? capaz hay algo de la defición que no entiendo

O sea para mi falta un list->next=node; ¿me entendés?
Así como hace node->next=newNode;

¿Por qué no hace falta enlazar de algún modo list con node? yo lo estoy pensando mal y lo sé pero es por alguna estructura o algo que no entendí
« Última modificación: 7 Mayo 2016, 16:08 pm por nisteeklod » En línea

LET'S DO STUFF!!
MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: [C] Listas enlazadas utilizando arreglos
« Respuesta #14 en: 7 Mayo 2016, 18:11 pm »

No se puede hacer list->next = node porqué node es solo un puntero y no tiene dato.
En la práctica es esto:
Código
  1. int* pint = malloc((sizeof(int));
  2. int* node;
  3.  
  4. node = pint;
  5.  
  6.  

Cuándo haces node = list ya creas la relación. node es list.
En línea

GGZ

Desconectado Desconectado

Mensajes: 144



Ver Perfil
Re: [C] Listas enlazadas utilizando arreglos
« Respuesta #15 en: 7 Mayo 2016, 18:18 pm »

AAahhh ¡Claro! que tonto, ahora si entendí
Eso era todo lo que quería que me digas no que me expliques el código entero  :xD


Muchas gracias!
« Última modificación: 7 Mayo 2016, 19:41 pm por nisteeklod » En línea

LET'S DO STUFF!!
MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: [C] Listas enlazadas utilizando arreglos
« Respuesta #16 en: 7 Mayo 2016, 19:56 pm »

Perfecto  ;-) ;-)
En línea

Páginas: 1 [2] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Listas enlazadas en c++
Programación C/C++
N3r0 3 8,543 Último mensaje 13 Julio 2010, 12:42 pm
por N3r0
[C] Listas enlazadas.
Programación C/C++
The Swash 5 31,598 Último mensaje 26 Octubre 2011, 04:56 am
por brians444
listas enlazadas
Programación C/C++
javier210186 3 2,859 Último mensaje 25 Octubre 2011, 02:33 am
por javier210186
venta de boletos de autobuses utilizando (colas ,listas o arboles) y archivos
Programación C/C++
Anduresu 2 3,987 Último mensaje 4 Agosto 2020, 03:43 am
por Anduresu
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines