01 type 02 regis = record 03 dado : integer; 04 prox : ^regis; 05 end; 06 apo = ^regis; 07 08 procedure mergelista(var novo, x,y : apo); 09 10 procedure troca(var x,y:apo); 11 var aux : apo; 12 begin 13 aux:=x; x:=y; y:=aux; 14 end; 15 16 var fim : apo; 17 18 begin 19 if (x=nil) or (y=nil) then 20 begin 21 if (x=nil) then troca(x,y); 22 novo:=x; 23 x:=nil 24 end 25 else begin 26 if (x^.dado>y^.dado) then troca(x,y); 27 novo:=x; 28 fim:=x; 29 x:=x^.prox; 30 while x <> nil do 31 begin 32 if (x^.dado>y^.dado) then troca(x,y); 33 fim^.prox:=x; 34 fim:=x; 35 x:=x^.prox 36 end; 37 if (x=nil) then troca(x,y); 38 fim^.prox:=x; 39 x:=nil 40 end 41 end;
Observe que o código nas linhas 26-29 é quase igual ao código nas
linhas 32-35. A única diferença é a variável novo
substituída por fim^.prox
. O mesmo ocorre em relação aos
blocos 21-23 e 37-39.
Seu desafio é escrever o mesmo código em C, mas fatorando o código comum mencionado acima, de modo que no final sua rotina vai conter no máximo dois ifs.