Pascal/Turbo Pascal - Ordenar lista de punteros doble

   
Vista:

Ordenar lista de punteros doble

Publicado por Maxi (20 intervenciones) el 22/10/2013 20:27:41
Quisiera alguna ayuda para poder ordenar la lista bajo dos criterios diferentes: tengo una lista simple apuntada por un puntero (Punt1) ordenada por un codigo (numero) de forma ascendente y el nodo de esta lista tiene un puntero al siguiente nodo de la lista, el codigo y ademas un puntero a un arbol que contiene datos. Los datos del arbol son tambien numeros. Se pide que se reordene la lista apuntada por otro puntero (Punt2) pero de mayor a menor de acuerdo a la cantidad de numeros menores a 10 que hay en el arbol. Punt1 y Punt2 comparten los mismos nodos. La funcion para contar los menores a 10 del arbol ya la tengo implementada y funciona todo bien, solo necesitaria como ordenar la lista por ese criterio
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

Ordenar lista de punteros doble

Publicado por ramon (2072 intervenciones) el 22/10/2013 21:51:03
Por favor puedes pasar les estructuras que tienes creadas para poderte seguir.
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

Ordenar lista de punteros doble

Publicado por Maxi (20 intervenciones) el 22/10/2013 21:54:42
program Parcial2013;
{Se tiene una lista de clientes, donde cada nodo tiene como dato: un codigo de cliente y tres punteros: un puntero a un arbol que tendra el numero de factura e importe de la factura (dicho arbol eta ordenado por numero de factura), un puntero al siguiente nodo de la lista y un puntero adicional para ordenar los nodos con un segundo criterio. Inicialmente estos punteros adicionales estan en nil, se piede actualizar los punteros para que la lista quede tambien ordenada de mayor a menor segun la cantidad de facturas cuyo importe sea menor a 100, para todas las facturas con numero de factura mayor o igual a un rango que se ingresa por teclado. No se puede utilizar estructuras auxiliares.}

uses crt;

type PArbol = ^TArbol;
TArbol = record
NumFac: integer;
Importe: real;
menores, mayores: PArbol
end;
PLista = ^TLista;
TLista = record
Cod_Clie: integer;
PuntSig_Clie: PLista;
PuntFacturas: PArbol;
PuntSigFactura: PLista
end;

function CantImp (Arbol: PArbol; Rango: integer): integer;
// Funcion que devuelve la cantidad de facturas cuyo numero de facturas es mayor igual al rango y su importe menor a 100
var Cant: integer;
begin
If (Arbol <> nil) then
begin
Cant:= 0;
If (Arbol^.NumFac >= Rango) then
If (Arbol^.Importe < 100) then
Cant:= 1;
CantImp:= Cant + CantImp (Arbol^.menores, rango) + CantImp (Arbol^.mayores, rango);
end
else
CantImp:= 0;
end;

{Aqui esta todo lo que tengo, el procedimiento de cargar la lista no es necesario y el de imprimir tampoco ya que se puede utilizar una libreria propia. Gracias por la atencion}
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

Ordenar lista de punteros doble

Publicado por ramon (2072 intervenciones) el 22/10/2013 23:44:55
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
{Fíjate en esto la ordenación se realiza normal mente pero la presentación es la que tu indiques
llague no se puede ordenar  por ese criterio }
 
 type
 
      punteroejemp = ^ejemplo;
     ejemplo = record
           datos : integer;
           sig : punteroejemp;
         end;
 
   var
     tecla : char;
     otrop, prime, anter, actu : punteroejemp;
     crite, nu : integer;
 
 
   procedure entramosdatos;
   begin
       with actu^ do
       begin
          write('Introduzca Datos : ');
          readln(datos);
       end;
   end;
 
 
   procedure otroregistroentra;
   begin
      if prime = nil then
      begin
          new(actu);
          entramosdatos;
          prime := actu;
          actu^.sig := nil;
      end
   else
      begin
          anter := actu;
          new(actu);
          entramosdatos;
          anter^.sig := actu;
          actu^.sig := nil;
      end;
    end;
 
    procedure listardatos(crite : integer);
    var
      ver : punteroejemp;
    begin
       ver := prime;
       while ver <> nil do
       begin
          with ver^ do
          if datos > crite then
          writeln(datos);
          ver := ver^.sig;
        end;
     end;
 
  procedure ordenademenosamas;
  var
    temp : integer;
    ren, ver : punteroejemp;
  begin
      ver := prime;
       while ver <> nil do
       begin
          ren := ver^.sig;
          while ren <> nil do
          begin
          with ren^ do
          if ver^.datos > datos then
          begin
             temp := ver^.datos;
             ver^.datos := datos;
             datos := temp;
          end;
          ren := ren^.sig;
          end;
          ver := ver^.sig;
        end;
  end;
 
  procedure ordenademasamenos;
  var
    temp : integer;
    ren, ver : punteroejemp;
  begin
      ver := prime;
       while ver <> nil do
       begin
          ren := ver^.sig;
          while ren <> nil do
          begin
          with ren^ do
          if ver^.datos < datos then
          begin
             temp := ver^.datos;
             ver^.datos := datos;
             datos := temp;
          end;
          ren := ren^.sig;
          end;
          ver := ver^.sig;
        end;
     end;
 
   procedure ordenaporcriterio(cri : integer);
  var
    temp : integer;
    ren, ver : punteroejemp;
  begin
      ver := prime;
       while ver <> nil do
       begin
          ren := ver^.sig;
          while ren <> nil do
          begin
          with ren^ do
          begin
          if datos < cri then
          begin
          end
        else
          begin
          if ver^.datos < datos then
          begin
             temp := ver^.datos;
             ver^.datos := datos;
             datos := temp;
          end;
        end;
      end;
          ren := ren^.sig;
          end;
          ver := ver^.sig;
        end;
     end;
 
  begin
 
      clrscr;
      writeln(' Entra 8 numeros');
      nu := 1;
      repeat
      otroregistroentra;
      nu := nu + 1;
      until nu > 8;
   repeat
       clrscr;
       writeln('  1 = Ordenado De Menor A Mallor');
       writeln('  2 = Ordenado De Mallor A Menor');
       writeln('  3 = Ordenado Por Criterio');
       writeln('  4 = Salir');
       writeln;
       writeln('  Elija Opcion ');
       repeat
       tecla := readkey;
       until tecla in['1','2','3','4'];
    case tecla of
  '1' : begin ordenademenosamas; crite := 0; end;
  '2' : begin ordenademasamenos; crite := 0; end;
  '3' : begin ordenaporcriterio(4); crite := 4; end;
    end;
      if tecla <> '4' then
      begin
      listardatos(crite);
      writeln;
      writeln('  Pulse Una Tecla');
      readkey;
      end;
   until tecla = '4';
  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