Usuario: anónimo

Usuarios en línea: 1
Invitados: 1

FAQ

Mensaje

1213m
Re: Duda sobre codigo listas enlazadas punteros y free
M(Steven Davidson) 2017-12-28 02:40:00  H

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@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@listas.conclase.net

>  http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net

>  Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ

>

_______________________________________________

Lista de correo Cconclase Cconclase@listas.conclase.net

http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net

Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ