RE:Insertar en lista por dos claves
Juan, el mecanismo es el mismo que para insertar ordenado por una sola clave. Excepto que se complica un poco.
Primero, tenés que declarar un nodo parecido a éste:
type ptrData=^recData;
recData=record
Dato:TDatosAlumno;
SigPorAnio:ptrData;
SigPorCurso:ptrData;
end;
Fijate que tenés dos punteros a siguiente. Uno lo vas a usar para trabajar la lista ordenada por año, y el otro para trabajarla por curso.
También vas a tener que tener dos punteros a lista principales. Es decir, si antes tenías un puntero a lista, con el cual entrabas y recorrías la lista, ahora vas a tener que tener dos: uno entra por el primer nodo ordenado por año, y el otro entra por primer nodo ordenado por curso.
Para insertar hacés lo mismo que hacés con una lista común, excepto que ahora necesitás dos procedimientos insertar. Uno inserta comparando el año y recorre por el puntero SigPorAnio, y el otro compara el curso y recorre usando SigPorCurso.
Digamos, un procedimiento estándar para insertar ordenado como éste:
procedure Insertar(var l,nuevo:pnodo);
var cursor,ant:pnodo;
begin
cursor:=l;
if l=nil then
l:=nuevo
else if (l<>nil) and (nuevo^.dato<=l^.dato) then {primer elemento}
begin
nuevo^.sig:=l;
l:=nuevo;
end
else
begin
cursor:=l;
while (cursor<>nil) and (cursor^.dato<nuevo^.dato) do
begin
ant:=cursor;
cursor:=cursor^.sig;
end;
if cursor=nil then
cursor^.sig:=nuevo
else
begin
nuevo^.sig:=ant^.sig;
ant^.sig:=nuevo;
end;
end;
end;
Fijate que este compara por el campo "dato" y avanza por el campo "sig". Bueno, vos ahora tendrías que tener dos procedimientos de estos, uno para cada dato.
Espero te sirva. Saludongos.