Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: TheShocker en 30 Diciembre 2015, 18:39 pm



Título: Duda sobre listas enlazadas (C)
Publicado por: TheShocker en 30 Diciembre 2015, 18:39 pm
Mi intención es crear una pila con listas enlazadas simples

El caso es que a la hora de insertar y eliminar en la última posición hay que recorrer siempre la lista enlazada. Mi pregunta es ¿Hay algún método que permita insertar/eliminar directamente desde el final?

Saludos


Título: Re: Duda sobre listas enlazadas (C)
Publicado por: GGZ en 30 Diciembre 2015, 19:24 pm
Mira este código es mio, lo que hago es insertar adelante me parece que si lo razonas un poco podés contestarte solo la pregunta.
Si se puede insertar desde el final, pensá lo que tendrías que hacer con la cabeza de la lista y demás.

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. struct node {
  5. int v;
  6. struct node * next;
  7. };
  8.  
  9. struct node * head=NULL;  // Cabeza apunta a nulo porque todav&#237;a no hay ning&#250;n elemento
  10.  
  11. void push (int n){ // Insertar elementos
  12.  
  13. struct node *m;
  14. m=(struct node *) malloc (sizeof(struct node));
  15.  
  16. m->next=head;
  17. m->v=n;
  18. head=m;
  19.  
  20. }
  21.  
  22. int pop (){ // Sacar elementos
  23. int m;
  24.  
  25. struct node * rem;
  26.  
  27. rem=head;
  28. m=rem->v;
  29. head=rem->next;
  30.  
  31. return m;
  32. }
  33.  
  34. int main (void){
  35.  
  36. struct node * mostrar; // PARA MOSTRAR LA LISTA
  37.  
  38. push (50);
  39. push (90);
  40.  
  41. printf ("Elemento que he sacado: %d\n",pop());
  42.  
  43. push (90);
  44.  
  45. mostrar=head;
  46.  
  47. while (mostrar != NULL){
  48. printf ("%d\n",mostrar->v);
  49. mostrar=mostrar->next;
  50. }
  51.  
  52.  
  53.  
  54. return 0;
  55. }
  56.  

He editado el código por uno más simple.


Título: Re: Duda sobre listas enlazadas (C)
Publicado por: TheShocker en 30 Diciembre 2015, 20:18 pm
Mira este código es mio, lo que hago es insertar adelante me parece que si lo razonas un poco podés contestarte solo la pregunta.
Si se puede insertar desde el final, pensá lo que tendrías que hacer con la cabeza de la lista y demás.

Muchas gracias, me ha servido de gran ayuda.


Título: Re: Duda sobre listas enlazadas (C)
Publicado por: MAFUS en 30 Diciembre 2015, 20:57 pm
Muy buenas.

nisteeklod, te has olvidado de liberar la memoria del nodo con free(). Cada vez que haces pop() el area de memoria apuntada por rem queda huerfana.


Título: Re: Duda sobre listas enlazadas (C)
Publicado por: TheShocker en 30 Diciembre 2015, 21:44 pm
Muy buenas.

nisteeklod, te has olvidado de liberar la memoria del nodo con free(). Cada vez que haces pop() el area de memoria apuntada por rem queda huerfana.

Cierto. Haciendo un free funciona perfectamente hasta que ya no hay elementos que sacar, que entonces se produce un error.


Título: Re: Duda sobre listas enlazadas (C)
Publicado por: MAFUS en 30 Diciembre 2015, 22:25 pm
Cierto, con lo que tendrás que controlar si hay algo para liberar antes de hacerlo. Mírate también el tema de que pasa si el usuario de tu pila hace un pop() nada mas empezar, sin haber siquiera introducido un dato en ella.


Título: Re: Duda sobre listas enlazadas (C)
Publicado por: GGZ en 31 Diciembre 2015, 00:28 am
Sí, me olvide usar la función free().

Cierto, con lo que tendrás que controlar si hay algo para liberar antes de hacerlo. Mírate también el tema de que pasa si el usuario de tu pila hace un pop() nada mas empezar, sin haber siquiera introducido un dato en ella.

Para solucionar eso deberías hacer es verificar si la cabeza es nula o no y, si necesitas sabes si hay más elementos verificar si head->next es nula.

Código
  1. int tienedos (){
  2.  
  3.      if (head == NULL || head->next == NULL) return 0;
  4.      else return 1;
  5. }

¿O me equivoco?

Saludos.


Título: Re: Duda sobre listas enlazadas (C)
Publicado por: MAFUS en 31 Diciembre 2015, 02:16 am
Sí, es una solución pero aun sigues teniendo el problema: la función pop() devuelve un entero, falle o no. ¿Cómo sabe el usuario que la función pop() ha fallado y el dato que devuelve es basura?


Título: Re: Duda sobre listas enlazadas (C)
Publicado por: GGZ en 31 Diciembre 2015, 03:29 am
Eeeh!? creo que no entendiste lo que hice, no permite llamar a pop() si no se cumple tienedos() o tieneuno()



Título: Re: Duda sobre listas enlazadas (C)
Publicado por: MAFUS en 31 Diciembre 2015, 04:13 am
Tienes razón. Pon el código para ver cómo seria.