Pascal/Turbo Pascal - Insertar en lista por dos claves

   
Vista:

Insertar en lista por dos claves

Publicado por Juan (83 intervenciones) el 02/11/2007 19:49:06
Mi duda es esta, como hago para insertar nodos en una lista ordenado por dos claves. Supongamos que quiero meter los nodos de un listado de alumnos ordenados por año y por curso en una única lista?. Como sería el procedimiento para insertar un nodo ordenado de esa manera? es mi gran duda, un saludo, suerte
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:Insertar en lista por dos claves

Publicado por M@rceloL (25 intervenciones) el 03/11/2007 16:46:42
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.
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