Pascal/Turbo Pascal - eliminar registro lista

 
Vista:

eliminar registro lista

Publicado por AnaGil (5 intervenciones) el 23/01/2007 23:32:27
Hola.Nadie me podria ayudar o como eliminar un elemento que se repite en una lista que esta desordenada y quedarnos por ejemplo con el de mayor edad de los que se repiten???Os agradeceria vuestra ayuda.
Gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:eliminar registro lista

Publicado por Carlos Guimaraenz (265 intervenciones) el 24/01/2007 00:12:59
Hola Ana... no he tenido tiempo para mirar el código... pero respecto a esta pregunta puntual, debes tener bien claro el concepto de punteros.
Lo que hay que hacer es cambiar el puntero del elemento anterior al que deseas eliminar, para que apunte al siguiente de éste, y luego hacer un DISPOSE del elemento eliminado...
Suponiendo que tienes el elemento actual apuntado por ACTUAL, ANT es el anterior, entonces debes hacer:
Si es el primer elemento, entonces cambias el primer puntero, y haces un DISPOSE de ACTUAL... Si es un elemento del medio, o el último haces:

ANT^.SIG := ACTUAL^.SIG; // cambias la dirección a la cual apunta ANT
DISPOSE(ACTUAL);

Espero que te sirva. Saludos!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:eliminar registro lista

Publicado por AnaGil (5 intervenciones) el 24/01/2007 08:05:08
Hola nuevamente.Eso lo tengo mas o menos claro pero eso es si tuviera la lista ordenada pero mi lista esta desordenada por tanto tengo que llevar varios punteros creo. Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:eliminar registro lista

Publicado por Carlos Guimaraenz (265 intervenciones) el 24/01/2007 18:23:34
Hola Ana! No, dá lo mismo que la lista esté o no ordenada. Lo que haces es recorrer la lista hasta encontrar el elemento, guardando siempre el puntero al elemento anterior. Si quieres guardar el dato de la persona que tenga mayor edad, entonces podrías tener dos punteros auxiliares, sí, uno para el actual y otro para el anterior, y luego la operación es igual a como te dije en el mensaje anterior. Si no entiendes avisame que te muestro un ejemplo. Hasta pronto!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:eliminar registro lista

Publicado por AnaGil (5 intervenciones) el 24/01/2007 19:53:46
Hola Carlos.Gracias portu paciencia.No consigo lo que quiero.Me podrias mostrar un ejemplo?
de nuevo 1000 gracias.
Un beso
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:eliminar registro lista

Publicado por Carlos Guimaraenz (265 intervenciones) el 24/01/2007 22:18:05
Hola Ana... aquí pongo un ejemplo, no lo hago exactamente con tus tipos definidos, pero es una aproximación (uso puntos sólo para mostrar indentación).

procedure Eliminar(var Lista : TLista);
var
····actual, ant, actualMax, antMax : TLista;
····maxEdad : byte;
begin
····maxEdad := 0;
····antMax := NIL;
····actualMax := NIL;
····actual := Lista; // Lista es el primer elemento de la lista
····ant := actual;
····while (actual <> NIL) do
····begin
········if (actual^.persona.nombre = nombre_a_borrar) then
········begin
············if (actual^.persona.edad >= maxEdad) then
············begin
················maxEdad := actual^.persona.edad;
················actualMax := actual;
················antMax := ant;
············end;
········end;
········ant := actual;
········actual := actual^.sig;
····end;
// cuando termino el while, verifico si existe un elemento para borrar
····if (actualMax <> NIL) then
····begin
········if (actualMax = Lista) then
············Lista := Lista^.sig
········else
············antMax^.sig := actualMax^.sig;
········Dispose(actualMax);
····end;
end;
-------------------
Lo que hace este procedimiento es buscar todos los elementos que coincidan con el nombre dado, y a su vez ir guardando el puntero actual y el anterior del que tenga mayor edad. Una vez que termina de recorrer toda la lista, verifica que haya encontrado al menos un nombre, y si es asi puede darse uno de dos casos:
1º que sea el primer elemento de la lista, en cuyo caso el puntero Lista (pasado por referencia) lo apunto al segundo elemento;
2º que sea otro elemento, y aquí lo que hago es enlazar al elemento anterior con el siguiente del que deseo eliminar;

En ambos casos, después libero la memoria del elemento borrado.

Espero haberme hecho entender (y también espero haberlo hecho bien :P)
Un beso!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:eliminar registro lista

Publicado por AnaGil (5 intervenciones) el 24/01/2007 23:49:04
Gracias Carlos.Te debo una.
Un besito!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar