Desafios

   Considere o seguinte código, que caiu na segunda prova:

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.