Pascal/Turbo Pascal - Listas

 
Vista:

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
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:Listas

Publicado por Carlos Guimaraenz (265 intervenciones) el 22/01/2007 02:06:28
Hola Ana! Sería muy útil si puedes facilitarme el código completo, o enviarme a mi mail el código y los ficheros necesarios, para hacer la prueba en mi PC.
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:Listas

Publicado por [email protected] (2 intervenciones) el 22/01/2007 08:12:37
Hola Carlos.Gracias por contestarme. Te comento, ya he conseguido la tercera lista a partir de otras dos.Pero ahora a partir de una lista con registros(campo nombre, apellidos, etc) quiero eliminar de la lista los registros que coincidan en nombre, es decir, si en la lista hay 3 Pedro's, que solo dejaré el que tenga mayor edad.¿Como puedo hacer esto?Gracias nuevamente y 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:Listas

Publicado por AnaGil (1 intervención) el 22/01/2007 13:23:13
Hola carlos nuevamente.Estoy intentando hacer el proced.que te he comentado, es decir,dada una lista de elementos,(son string),quiero quedarme solo con los nombres que tengan mayor edad.Te pongo el codigo que he realizado pero me da un error:
Error 202:stack overflow error
Si me puedieras echar una mano te lo agradeceria.Gracias

(*AntActual lo inicializo a nil*)

Procedure Eliminar(VAR Lista3:PNodo;VAR AntActual:PNodo);
VAR
AuxActual,AuxLista,Actual,AntLista:PNodo;
BEGIN
Actual:=Lista3;
WHILE Lista3 <> Nil DO
BEGIN
AntLista:=Lista3;
Lista3:=Lista3^.Sig;
IF (Actual^.registro.nombre = Lista3^.Registro.nombre)
AND (Actual^.registro.edad < Lista3^.Registro.edad) THEN
BEGIN
AuxActual:=Actual^.Sig;
AntActual^.Sig:=AuxActual;
Dispose(Actual);
END
ELSE
IF (Actual^.registro.nombre = Lista3^.Registro.nombre)
AND (Actual^.registro.edad > Lista3^.Registro.edad) THEN
BEGIN
AuxLista:=Lista3^.Sig;
AntLista^.Sig:=AuxLista;
Dispose(Lista3);
END;
END;
IF Lista3 = Nil THEN
AntActual:=Actual;
Eliminar(Actual^.Sig,AntActual);

END;
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:Listas

Publicado por Carlos Guimaraenz (265 intervenciones) el 22/01/2007 20:51:22
Hola Ana, nuevamente te pido que me envíes el código y los ficheros con los que trabajas de manera que pueda probar el programa completo y trabajar sobre él.
Muchas gracias y hasta luego!
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:Listas

Publicado por AnaGil (5 intervenciones) el 23/01/2007 08:51:18
Hola Carlos.te he enviado un correo con el codigo.Gracias
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