Listas
Publicado por AnaGil (2 intervenciones) el 21/01/2007 12:30:59
Buenos dias.Estoy un poco liada con el tema de las listas y me gustaria si alguien me podria echar una mano please.
Os pongo lo que quiero conseguir. Tengo 2 ficheros con sus registros y campos correspondientes.Yo estos ficheros los he ordenado por el campo nombre utilizando listas mediante un procedimiento.He utilizado primero el procedimiento para el fichero 1 y a continuacion el mismo procedimiento para el fichero 2.Y esto me lo hace bien.
Os pongo el procedimiento de ordenar los ficheros que he realizado:
Previamente estan definidos ficheros,registros, etc.
Procedure OrdenarFichero(VAR Fichero:tipo_fich;VAR Lista:PNodo);
VAR
Nuevo,P,Anterior:PNodo;
registro:tipo_registro;
Posicion:integer;
i,j:integer;
fin:boolean;
Clave:integer;
BEGIN
Reset(Fichero);
Posicion:=0;
WHILE NOT EOF (Fichero) DO
BEGIN
Seek(Fichero,PosicionC);
Read(Fichero,registro);
FOR j:=1 TO registro.num_reg DO
BEGIN
New(Nuevo);
Nuevo^.Registro:=registro.lista_reg[j];
Nuevo^.Sig:=Nil;
Anterior:=Nil;
IF Primero = Nil THEN
BEGIN
FOR i:=1 TO length(registro.lista_reg[j].nombre) DO
Nuevo^.Clave := Ord(registro.lista_reg[j].nombre[1]);
Primero:=Nuevo;
END
ELSE
BEGIN
P:=Primero;
fin:=false;
FOR i:=1 TO length(registro.lista_reg[j].nombre) DO
Nuevo^.Clave := Ord(registro.lista_reg[j].nombre[1]);
WHILE (P <> Nil) AND (NOT fin) DO
BEGIN
IF P^.Clave < Nuevo^.Clave THEN
BEGIN
Anterior:=P;
P:=P^.Sig;
END
ELSE
BEGIN
IF (Anterior<>Nil) THEN
BEGIN
Anterior^.Sig:=Nuevo;
Nuevo^.Sig:=P;
fin:=true;
END
ELSE
BEGIN
Nuevo^.Sig:=P;
Primero:=Nuevo;
fin:=true;
END;
END;
END;
IF NOT fin THEN
BEGIN
Anterior^.Sig:=Nuevo;
Nuevo^.Sig:=Nil;
END;
END;
END;(*FOR*)
Posicion:=Posicion+1;
END;
Lista:=Primero;
END;
Entonces lo que yo quiero conseguir es que despues de haber ejecutado este procedimiento con los dos ficheros que tengo,me devuelva una tercera lista con la mezcla de ambos ficheros tambien ordenado. Y es que me estoy volviendo loca con las listas ya que no consigo ver como hacerlo.Si alguien me puede echar una mano se lo agradeceria.GRacias.Un beso
Os pongo lo que quiero conseguir. Tengo 2 ficheros con sus registros y campos correspondientes.Yo estos ficheros los he ordenado por el campo nombre utilizando listas mediante un procedimiento.He utilizado primero el procedimiento para el fichero 1 y a continuacion el mismo procedimiento para el fichero 2.Y esto me lo hace bien.
Os pongo el procedimiento de ordenar los ficheros que he realizado:
Previamente estan definidos ficheros,registros, etc.
Procedure OrdenarFichero(VAR Fichero:tipo_fich;VAR Lista:PNodo);
VAR
Nuevo,P,Anterior:PNodo;
registro:tipo_registro;
Posicion:integer;
i,j:integer;
fin:boolean;
Clave:integer;
BEGIN
Reset(Fichero);
Posicion:=0;
WHILE NOT EOF (Fichero) DO
BEGIN
Seek(Fichero,PosicionC);
Read(Fichero,registro);
FOR j:=1 TO registro.num_reg DO
BEGIN
New(Nuevo);
Nuevo^.Registro:=registro.lista_reg[j];
Nuevo^.Sig:=Nil;
Anterior:=Nil;
IF Primero = Nil THEN
BEGIN
FOR i:=1 TO length(registro.lista_reg[j].nombre) DO
Nuevo^.Clave := Ord(registro.lista_reg[j].nombre[1]);
Primero:=Nuevo;
END
ELSE
BEGIN
P:=Primero;
fin:=false;
FOR i:=1 TO length(registro.lista_reg[j].nombre) DO
Nuevo^.Clave := Ord(registro.lista_reg[j].nombre[1]);
WHILE (P <> Nil) AND (NOT fin) DO
BEGIN
IF P^.Clave < Nuevo^.Clave THEN
BEGIN
Anterior:=P;
P:=P^.Sig;
END
ELSE
BEGIN
IF (Anterior<>Nil) THEN
BEGIN
Anterior^.Sig:=Nuevo;
Nuevo^.Sig:=P;
fin:=true;
END
ELSE
BEGIN
Nuevo^.Sig:=P;
Primero:=Nuevo;
fin:=true;
END;
END;
END;
IF NOT fin THEN
BEGIN
Anterior^.Sig:=Nuevo;
Nuevo^.Sig:=Nil;
END;
END;
END;(*FOR*)
Posicion:=Posicion+1;
END;
Lista:=Primero;
END;
Entonces lo que yo quiero conseguir es que despues de haber ejecutado este procedimiento con los dos ficheros que tengo,me devuelva una tercera lista con la mezcla de ambos ficheros tambien ordenado. Y es que me estoy volviendo loca con las listas ya que no consigo ver como hacerlo.Si alguien me puede echar una mano se lo agradeceria.GRacias.Un beso
Valora esta pregunta


0