RE:eliminar registro lista
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!