Programación General > Pascal

 Re: Ordenacion Por Selección

<< < (3/3)

Amilius:

--- Cita de: "thot_ohm" --- Rescatando un poco este post y para dejar la solución al problema que planteaba para futuras consultas.

Lo del "error while linking" y el "exitcode=216" al parecer lo provocaba el compilador (FreePascal), probé con TurboPascal y corre sin problemas.

El procedimiento cambiar quedó definitivamente de la siguiente manera:


--- Código: Text --- procedure Cambiar (var Lista : TipoListaEnlazada; var Mayor, Menor : PunteroLista); var  Aux : PunteroLista;begin        new(Aux);  Aux^.Datos := Mayor^.Datos;  Mayor^.Datos := Menor^.Datos;  Menor^.Datos := Aux^.Datos;end;  
Lo que hice fué simplemente cambiar los datos contenidos en los punteros sin cambiar sus enlaces. No se si será medio chapucera esta forma, pero así funciona.

Agradecería cualquier sugerencia, pero como digo, funciona.
--- Fin de la cita ---
Pues estas dejando muchos nodos huerfanos de padre y madre...  :lol:

Normalmente la cosa funciona asi:


--- Código: Text --- procedure Cambiar (var Mayor, Menor : PunteroALosDatos);var  Aux : PunteroALosDatos;begin  Aux := Mayor;  Mayor := Menor;  Menor := Aux;end;  
Y luego tienes que asegurarte que sus punteros de enlace al anterior y siguiente apunten a donde quieres. Complicacion que te ganaste por el tipo de estructura de datos que estas usando. Una forma más comoda es usar 3 punteros: al anterior, al actual y al siguiente, asi cuando quieres intercambiar valores de los nodos solo intercambias los indices a ese gran arreglo estatico llamado ram guardados en los punteros "actuales", sin tener las complicaciones de evitar que tu lista quede fragmentada.

P.D. "Datos" no figura en los tipos que definiste, es simplemente una forma de abreviar o efectivamente Datos ahora es una variable del tipo puntero a los datos de tu nodo?

thot_ohm:
Hola Amilus:

He probado así como dices tú, incluso acabo de modificar el procedimiento para probar la forma que me indicas, pero la lista no se ordena.

No entiendo cuando dices que dejo un montón de nodos huérfanos  <_< . Simplemente cambio la información de un nodo a otro, pero no toco la estructura de la lista. Si te refieres al Aux que queda siempre por ahí pues con un dispose lo arreglo, no?

Bueno, tu me dices en que me estoy equivocando. Gracias.

Amilius:

--- Cita de: "thot_ohm" --- Hola Amilus:

He probado así como dices tú, incluso acabo de modificar el procedimiento para probar la forma que me indicas, pero la lista no se ordena.

No entiendo cuando dices que dejo un montón de nodos huérfanos  <_< . Simplemente cambio la información de un nodo a otro, pero no toco la estructura de la lista. Si te refieres al Aux que queda siempre por ahí pues con un dispose lo arreglo, no?

Bueno, tu me dices en que me estoy equivocando. Gracias.
--- Fin de la cita ---
Si, efectivamente me referia al Aux. Si Datos es un registro y no un puntero no hay problema, pero no es eficiente por que mueves toda la memoria del registro en lugar de sólo modificar los punteros. (De todas formas un codigo que funciona es mejor que uno que no funciona aunque en teoria si funcionara fuera mas eficiente  :P ) Si Datos es un puntero el new() esta demás por que sólo necesitas intercambiar las posiciones de memoria que contienen.

Finalmente si no utilizas: var Lista : TipoListaEnlazada , seria bueno que lo quites para no desperdiciar tiempo de cpu al pasar ese parametro.

P.D.

Para asegurarte que todo marcha bien seria bueno que al reservar memoria y al liberarla pusieras en pantalla algun mensaje y mejor si tienes un contador en alguna variable global para saber cuantas veces reservaste memoria para un nodo y cuantas veces liberaste la memoria de un nodo.

thot_ohm:
Gracias Amilus.

Cuando llamo al procedimiento cambiar, me llevo los parámetros que viste, Lista, mayor y menor. Lo que no estoy seguro es si esto esta bien o no. La verdad es que me ha costado bastante hacer el programita y eso ha sido leyendo de un lado y de otro y adaptando código. Voy a adjuntar el código completo del programa a ver si le puedes echar un vistazo y me dices si voy bien.

Gracias por tu tiempo.

Navegación

[0] Índice de Mensajes

[*] Página Anterior

Ir a la versión completa