[C con Clase] Duda sobre codigo listas enlazadas punteros y free

Davidson, Steven srd4121 en njit.edu
Jue Dic 28 03:40:00 CET 2017


Hola Matías,

No funciona correctamente, pero puede funcionar correctamente. La lógica es
incorrecta, por lo que deberías modificar la lista enlazada, antes de
liberar un nodo.

En tu caso, necesitas el puntero 'next' del nodo anterior al igual que el
siguiente nodo de este nodo que quieres eliminar. Esto significa que
necesitas dos punteros: uno para vincular el nodo al siguiente y otro para
eliminar su memoria. Como hay un caso particular para eliminar el primer
nodo, se suele comprobar aparte del caso general; esto es,

// Caso particular:  eliminar la cabeza
if( (*pstart)->number == num )
{
  free( *pstart );
  *pstart = NULL;
  return;
}

// Caso general:  eliminar otros nodos
for(  ; (*pstart)->next ; pstart = &(*pstart)->next )
{
  if( (*pstart)->next->number == num )
  {
    LIST *ptr = (*pstart)->next->next;
    free( (*pstart)->next );
    *pstart = ptr;
    return;
  }
}

En la función, 'add()', no necesitas el primer bucle 'while'.

En la función, 'print()', no necesitas aceptar un doble puntero; un puntero
singular es suficiente.


Espero que esto te aclare las dudas.

Steven


2017-12-27 14:53 GMT-05:00 Matias M. <section1.op en gmail.com>:

> Buenas lista...tanto tiempo..
>
> Es algo rápido que no estoy dando con la solución..
> supongo que soy YO el que esta mal..
>
> tengo este código de listas linkeadas que hice para probar(hice un
> pastebin colorido)
> http://dpaste.com/059KFXV
>
> que básicamente agrega números a una lista y los borra
> usando punteros...
> en la parte de eliminar tengo el codigo asi:
>
>         while (*pstart) {
>                 if ((*pstart)->number == num ) {
>                         free(*pstart);
>                         *pstart = (*pstart)->next;
>                         return;
>                 }
>                 pstart = &(*pstart)->next;
>         }
>
> si el numero es el que yo busco/paso
> hace un free primero
> y después usa el mismo "puntero a puntero"(pstart)
> para apuntar al próximo ...
>
> esto funciona y no entiendo porque..si antes hice un free.
> no se de donde saca la info para el próximo:
> (*pstart)->next;
>
> no se si me explico bien pero cualquier cosa me preguntan.
> Saludos
> Matias.
>
> PD: Buenas fiestas para todos/as.
>
> _______________________________________________
> Lista de correo Cconclase Cconclase en listas.conclase.net
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20171227/44fab622/attachment.html>


Más información sobre la lista de distribución Cconclase