Duda sobre listas enlazadas (C)

Iniciado por TheShocker, 30 Diciembre 2015, 18:39 PM

0 Miembros y 1 Visitante están viendo este tema.

TheShocker

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

GGZ

#1
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.

#include <stdio.h>
#include <stdlib.h>

struct node {
int v;
struct node * next;
};

struct node * head=NULL;  // Cabeza apunta a nulo porque todavía no hay ningún elemento

void push (int n){ // Insertar elementos

struct node *m;
m=(struct node *) malloc (sizeof(struct node));

m->next=head;
m->v=n;
head=m;

}

int pop (){ // Sacar elementos
int m;

struct node * rem;

rem=head;
m=rem->v;
head=rem->next;

return m;
}

int main (void){

struct node * mostrar; // PARA MOSTRAR LA LISTA

push (50);
push (90);

printf ("Elemento que he sacado: %d\n",pop());

push (90);

mostrar=head;

while (mostrar != NULL){
printf ("%d\n",mostrar->v);
mostrar=mostrar->next;
}



return 0;
}


He editado el código por uno más simple.
LET'S DO STUFF!!

TheShocker

Cita de: nisteeklod 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.

Muchas gracias, me ha servido de gran ayuda.

MAFUS

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.

TheShocker

Cita de: 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.

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

MAFUS

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.

GGZ

#6
Sí, me olvide usar la función free().

Cita de: 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.

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.

int tienedos (){
     
      if (head == NULL || head->next == NULL) return 0;
      else return 1;
}


¿O me equivoco?

Saludos.
LET'S DO STUFF!!

MAFUS

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?

GGZ

Eeeh!? creo que no entendiste lo que hice, no permite llamar a pop() si no se cumple tienedos() o tieneuno()

LET'S DO STUFF!!

MAFUS

Tienes razón. Pon el código para ver cómo seria.