program addListElements; type nodo = record info : integer; next : integer end; vectorNodo = array [0..15] of nodo; vectorPtr = array [0..15] of integer; vector = array [0..15] of integer; var n,nMasUno : integer; logn : integer; k : integer; lista : vectorNodo; head,tail : integer; P : vectorPtr; suma,total : vector; procedure log2(n : integer;var x : integer); begin if n <= 0 then writeln('error') else begin x := 0; while &x < n do x := x+1; end end; procedure inicializa; var i,actual : integer; begin writeln('TECNICA DE DOBLADO'); writeln('CALCULO PARALELO DE LA SUMA DE LOS ELEMENTOS DE UNA LISTA'); i := 0; write('N£mero de elementos en la lista: '); read(nMasUno); writeln(''); n := nMasUno-1; log2(nMasUno,logn); write('Cabecera de lista (entre 0 y ',n,'): '); read(head); writeln(''); write('Informaci¢n en ese nodo (un n£mero): '); read(lista[head].info); writeln(''); actual := head; repeat write('introduzca siguiente de lista[',actual,'] '); read(lista[actual].next); writeln(''); actual := lista[actual].next; write('introduzca informaci¢n de lista[',actual,'] '); read(lista[actual].info); i := i+1; until (i>=n); lista[actual].next := actual; tail := actual; end (* inicializa *); procedure resultados; var i : integer; begin write('RESULTADOS: '); i := head; while (i <> tail) do begin write(total[i],' '); i := lista[i].next; end; writeln(total[i]); end; begin (* addList *) inicializa; parallel 0..n do begin P[name] := lista[name].next; suma[name] := lista[name].info; if (P[name] <> name) and (P[P[name]] = P[name]) then suma[name] := suma[name]+suma[P[name]]; end (* parallel *); k := 0; while k < logn do begin parallel 0..n do if P[name] <> P[P[name]] then begin suma[name] := suma[name]+suma[P[name]]; P[name] := P[P[name]]; end (* if *); k := k+1; end (* while *); parallel 0..n do total[name] := suma[name]; resultados; end.