
Merge de N listas
Publicado por Eduardo Antonio (12 intervenciones) el 23/09/2013 02:19:36
Hola. Tengo este problema:
Un compañía de celulares dispone de una estructura donde para cada mes (1..12) almacena las
recargas de crédito realizadas por sus clientes. De cada recarga se conoce: código de celular, monto de
recarga y fecha de la recarga (día, mes y año).
Las recargas registradas en cada mes están ordenadas por código de celular, y para un celular pueden
registrarse 0,1 o más recargas en el mes.
Además la compañía dispone de una estructura donde para cada mes (1..12) y cada día (1..31)
almacena un monto adicional de regalo adjudicado a los clientes.
Generar una estructura que totalice para cada código de celular el monto abonado en recargas anual, y
el monto adicional de regalo que se le adjudicó en el año. Esta estructura debe estar ordenada por
código de celular, y para su generación se debe recorrer una sola vez los datos de la estructura principal.
Ya tengo entendido que para hacer un merge de listas, yo debería tomas el valor menor e insertarlo a la nueva lista ordenada. Pero se hacerlo con dos listas y no con 12 o mas listas.
Aca les dejo el cod de un programa mas o menos parecido que hice que no es este que digo pero es para que se vea mas o menos como manejo yo el tema de armar la lista 3 con los elementos de l1 y l2.
Un compañía de celulares dispone de una estructura donde para cada mes (1..12) almacena las
recargas de crédito realizadas por sus clientes. De cada recarga se conoce: código de celular, monto de
recarga y fecha de la recarga (día, mes y año).
Las recargas registradas en cada mes están ordenadas por código de celular, y para un celular pueden
registrarse 0,1 o más recargas en el mes.
Además la compañía dispone de una estructura donde para cada mes (1..12) y cada día (1..31)
almacena un monto adicional de regalo adjudicado a los clientes.
Generar una estructura que totalice para cada código de celular el monto abonado en recargas anual, y
el monto adicional de regalo que se le adjudicó en el año. Esta estructura debe estar ordenada por
código de celular, y para su generación se debe recorrer una sola vez los datos de la estructura principal.
Ya tengo entendido que para hacer un merge de listas, yo debería tomas el valor menor e insertarlo a la nueva lista ordenada. Pero se hacerlo con dos listas y no con 12 o mas listas.
Aca les dejo el cod de un programa mas o menos parecido que hice que no es este que digo pero es para que se vea mas o menos como manejo yo el tema de armar la lista 3 con los elementos de l1 y l2.
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
program p11e02;
const
val_corte=999;
type
lis_stk:=^nodo_stk;
nodo_stk =record
cod:integer;
des:string;
stk:integer;
sig:lis_stk;
end;
lis_pro:=^nodo_pro;
nodo_pro =record
cod:integer;
cant:integer;
sig:lis_pro;
end;
var
ls:lis_stk;
l1,l2,l3:lis_pro;
procedure minimo (var l1:lis_pro,l2:lis_pro; cod_min,cant:integer);
var
if (l1=nil)and(l2=nil) then
cod_min:=val_corte
else
if (l1<>nil)and(l2<>nil) then
if (l1^.cod<=l2^.cod)then begin
cod_min:=l1^.cod;
cant:=l1^.cant;
l1:=l1^.sig;
end
else begin
cod_min:=l2^.cod;
cant:=l2^.cant;
l2:=l2^.sig;
end
else
if (l2=nil) then begin
cod_min:=l1^.cod;
cant:=l1^.cant;
l1:=l1^.sig;
end
else begin
cod_min:=l2^.cod;
cant:=l2^.cant;
l2:=l2^.sig;
end;
end;
procedure AgregaAt (var l3:lis_pro; var ult3:lis_pro; cod,total:integer);
var
aux:lis_pro;
begin
new(aux);
aux^.cod:=cod;
aux^.cant:=total;
aux^.sig:=nil;
if (l3=nil) then begin
l3:=aux;
end
else
ult3^.sig:=aux;
ult3:=aux;
end;
procedure ActualizaStk(var ls:lis_stk; cod_min,tot:integer);
begin
while (ls^.cod<cod_min) do
ls:=ls^.sig;
ls^.stk:=ls^.stk-tot;
end;
procedure merge (l1,l2:lis_pro; ls:lis_stk; var l3:lis_pro);
var
cod_min,cant,cod_act,tot:integer;
ultl3:lis_pro;
begin
minimo(l1,l2,cod_min,cant);
while (min<>val_corte)do begin
total:=0;
cod_act:=min;
while (cod_act=min) do begin
tot:=tot+cant;
minimo(l1,l2,cod_min,cant);
end;
AgregaAt(l3,ult3,cod_act,tot);
ActualizaStk(ls,cod_act,tot);
end;
end;
procedure DosMayores (l3:lis_pro);
var
max1,max2,cod1,cod2:integer;
begin
max1:=-1;
max2:=0;
while (l3<>nil) do begin
if (l3^.cant>max1) then begin
max2:=max1;
max1:=l3^.cant;
cod2:=cod1;
cod1:=l3^.cod;
end
else
if (l3^.cant>max2) then begin
max2:=l3^.cant;
cod2:=l3^.cod;
end;
l3:=l3^.sig;
end;
writeln('Los codigos mas vendidos fueron los cod:', cod1,cod2);
readln;
end;
begin
l1:nil;
l2:nil;
GenerarL1(l1); //se dispone
GenerarL2(l2); //se dispone
GenerarLS(ls); //se dispone
l3:=nil;
merge(l1,l2,ls,l3);
DosMayores (l3);
end.
Valora esta pregunta


0