Usuario: anónimo

Usuarios en línea: 1
Invitados: 1

FAQ

Mensaje

20m
Re: Duda sobre codigo listas enlazadas punteros y free
U(None) 2017-12-28 13:38:43  H

Hola Steven

Gracias por la pronta respuesta..!

voy respondiendo mas o menos ordenado.

> Como hay un caso particular para eliminar el primer nodo, se suele comprobar aparte del caso general

claro la idea es evitar justamente ese chequeo(el primer nodo) usando

punteros y funciona bien.

que es donde me pierdo...

esta linea(linea 109 en el pastebin) es la que no me cierra.

*pstart = (*pstart)-> next;

que es la que elimina el nodo.pero no le encuentro logica.

agregue un ptr temporal para el hacer el free como recomendaste. que

era lo esperado

pero tenia la dudas de porque NO me fallaba en la ejecución . al

agregar por ejemplo

un miembro "string" a la lista empezó a tirar el segvfault cuando

liberaba..eso estaba esperando.

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

si dos veces el mismo bucle se me paso...eleminado.

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

si en verdad lo utilice para ver como asignaba las posiciones de memorias

como para debuguear..

se ve como re-utiliza de vuelta los espacios liberados de memoria con free.

si comento el free...usa nuevas direcciones de memoria.

source modificado: http://dpaste.com/13ET6QX

ahora al correr el binario me sale como output esto:

List Empty

List EMPTY...nothing to delete

adding number to list

num = 1

pstart addr = 0x555d65a28420 pstart-> next = 0x555d65a2af30

num = 2

pstart addr = 0x555d65a2af30 pstart-> next = 0x555d65a2da40

num = 3

pstart addr = 0x555d65a2da40 pstart-> next = 0x555d65a30550

num = 4

pstart addr = 0x555d65a30550 pstart-> next = 0x555d65a33060

num = 5

pstart addr = 0x555d65a33060 pstart-> next = 0x555d65a35b70

num = 6

pstart addr = 0x555d65a35b70 pstart-> next = 0x555d65a38680

num = 7

pstart addr = 0x555d65a38680 pstart-> next = 0x555d65a3b190

num = 8

pstart addr = 0x555d65a3b190 pstart-> next = 0x555d65a3dca0

num = 9

pstart addr = 0x555d65a3dca0 pstart-> next = (nil)

deleting numbers to list

list now:

num = 9

pstart addr = 0x555d65a3dca0 pstart-> next = (nil)

adding one more number

final print

num = 9

pstart addr = 0x555d65a3dca0 pstart-> next = 0x555d65a28420

num = 0

pstart addr = 0x555d65a28420 pstart-> next = 0x555d65a2af30

num = 0

pstart addr = 0x555d65a2af30 pstart-> next = 0x555d65a2da40

num = 0

pstart addr = 0x555d65a2da40 pstart-> next = 0x555d65a30550

num = 0

pstart addr = 0x555d65a30550 pstart-> next = 0x555d65a33060

num = 0

pstart addr = 0x555d65a33060 pstart-> next = 0x555d65a35b70

num = 0

pstart addr = 0x555d65a35b70 pstart-> next = 0x555d65a38680

num = 0

pstart addr = 0x555d65a38680 pstart-> next = 0x555d65a3b190

num = 0

pstart addr = 0x555d65a3b190 pstart-> next = 0x555d65a407b0

num = 0

pstart addr = 0x555d65a407b0 pstart-> next = 0x555d65a432c0

num = 0

pstart addr = 0x555d65a432c0 pstart-> next = (nil)

2017-12-27 23:40 GMT-03:00 Davidson, Steven <srd4121@njit.edu>:

>  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

_______________________________________________

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