• Domingo 22 de Diciembre de 2024, 17:06

Autor Tema:  Lio con sublistas  (Leído 1146 veces)

daligar

  • Nuevo Miembro
  • *
  • Mensajes: 1
    • Ver Perfil
Lio con sublistas
« en: Miércoles 18 de Agosto de 2010, 19:32 »
0
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;