Ordenar sublistas
Publicado por Dani (1 intervención) el 18/08/2010 19:20:18
Necesito su ayuda xk me voy a volver loco. Es algo sencillo pero que no sé donde fallo.
Quiero ordenar la sub-lista por orden alfabetico segun el nombre de la tienda,donde fallo?
program prueba;
uses crt;
TYPE
punt_tienda_precio =^nodo_tienda_precio; {Nodo de la SUBLISTA}
nodo_tienda_precio=RECORD
tienda : string;
precio : string;
sig : punt_tienda_precio;
end;
punt_produc = ^nodo_produc;{Nodo de la LISTA}
nodo_produc = RECORD
nombre : string;
datos : punt_tienda_precio;
sig : punt_produc
end;
PROCEDURE Ordena_sub(cab_produc : punt_produc);
VAR
p_dato : punt_tienda_precio;
p_info : punt_produc;
aux, ant, pos : punt_tienda_precio;
cambio, x : INTEGER;
BEGIN
IF cab_produc<>nil THEN
BEGIN
p_info:=cab_produc; {Puntero auxiliar a la cabecera de LISTA}
WHILE p_info<>nil DO
BEGIN
p_dato:=p_info^.datos; {Enlazar un nodo de LISTA con
el nodo cabecera de su SUBLISTA}
new(ant);
ant^.sig:=p_dato;
pos:=NIL;
aux:=p_dato;
x:=0; {inicializamos valores}
IF (aux <> NIL) AND (aux^.sig <> NIL) THEN
{Si sublista no tiene nodos o solo tiene uno no hay que hacer nada}
BEGIN
REPEAT
aux:=p_dato;
x:=0;
{Cada vuelta del bucle REPEAT estas variables deben inicializarse }
WHILE aux^.sig <> NIL DO {Mientras que aux no llegue al ultimo nodo}
BEGIN
cambio:=0; {No se han intercambiado nodos, por tanto, cambio = 0 }
IF Upcase(aux^.tienda) > Upcase( aux^.sig^.tienda) THEN
BEGIN
{En cuanto el nodo superior tenga un caracter mayor que el inferior se
intercambia los nodos, la sentencia despues del OR se implementa para
los casos por ejemplo que titulo = a y titulo.sig = aa }
pos:=aux^.sig;
aux^.sig:=aux^.sig^.sig;
pos^.sig:=aux;
IF aux = p_dato THEN p_dato:=pos
ELSE ant^.sig:=pos;
INC(cambio);
INC(x);
{Se produjo un intercambio por tanto incrementamos}
BREAK;
END;
IF cambio <> 0 THEN ant:=pos
ELSE
BEGIN ant:=aux; aux:=aux^.sig;
END;
END; {WHILE}
{Continuamos hasta que lleguemos al final de lista }
UNTIL
x = 0
{Continuamos hasta que nose haya tenido que intercambiar ningun nodo en la lista}
END; {IF 1}
p_info:=p_info^.sig; {Avanzar puntero en LISTA}
END;
end;
end;
Quiero ordenar la sub-lista por orden alfabetico segun el nombre de la tienda,donde fallo?
program prueba;
uses crt;
TYPE
punt_tienda_precio =^nodo_tienda_precio; {Nodo de la SUBLISTA}
nodo_tienda_precio=RECORD
tienda : string;
precio : string;
sig : punt_tienda_precio;
end;
punt_produc = ^nodo_produc;{Nodo de la LISTA}
nodo_produc = RECORD
nombre : string;
datos : punt_tienda_precio;
sig : punt_produc
end;
PROCEDURE Ordena_sub(cab_produc : punt_produc);
VAR
p_dato : punt_tienda_precio;
p_info : punt_produc;
aux, ant, pos : punt_tienda_precio;
cambio, x : INTEGER;
BEGIN
IF cab_produc<>nil THEN
BEGIN
p_info:=cab_produc; {Puntero auxiliar a la cabecera de LISTA}
WHILE p_info<>nil DO
BEGIN
p_dato:=p_info^.datos; {Enlazar un nodo de LISTA con
el nodo cabecera de su SUBLISTA}
new(ant);
ant^.sig:=p_dato;
pos:=NIL;
aux:=p_dato;
x:=0; {inicializamos valores}
IF (aux <> NIL) AND (aux^.sig <> NIL) THEN
{Si sublista no tiene nodos o solo tiene uno no hay que hacer nada}
BEGIN
REPEAT
aux:=p_dato;
x:=0;
{Cada vuelta del bucle REPEAT estas variables deben inicializarse }
WHILE aux^.sig <> NIL DO {Mientras que aux no llegue al ultimo nodo}
BEGIN
cambio:=0; {No se han intercambiado nodos, por tanto, cambio = 0 }
IF Upcase(aux^.tienda) > Upcase( aux^.sig^.tienda) THEN
BEGIN
{En cuanto el nodo superior tenga un caracter mayor que el inferior se
intercambia los nodos, la sentencia despues del OR se implementa para
los casos por ejemplo que titulo = a y titulo.sig = aa }
pos:=aux^.sig;
aux^.sig:=aux^.sig^.sig;
pos^.sig:=aux;
IF aux = p_dato THEN p_dato:=pos
ELSE ant^.sig:=pos;
INC(cambio);
INC(x);
{Se produjo un intercambio por tanto incrementamos}
BREAK;
END;
IF cambio <> 0 THEN ant:=pos
ELSE
BEGIN ant:=aux; aux:=aux^.sig;
END;
END; {WHILE}
{Continuamos hasta que lleguemos al final de lista }
UNTIL
x = 0
{Continuamos hasta que nose haya tenido que intercambiar ningun nodo en la lista}
END; {IF 1}
p_info:=p_info^.sig; {Avanzar puntero en LISTA}
END;
end;
end;
Valora esta pregunta
0