intercambi.pas
{ ppc386 -va -vh *.pas }
{ COMIENZO DE DESCRIPCION
Escribir un procedure INTERCAMBIA (var L:lista); que
intercambia los elementos de L de tal forma que aquellos
que est\'an en una posici\'on impar son intercambiados con
el elemento en la posici\'on par inmediatamente siguiente.
Es decir, el primero es intercambiado con el segundo, el
tercero con el cuarto y asi siguiendo. Si el n\'umero de
elementos es impar, entonces el ultimo elemento queda
inalterado. Asi por ejemplo, si la listas es
L=(10 1 15 7 2 19 15 16 11 15 9 13 3 7 6 12 1)
entonces despu\'es de intercambiar debemos tener
L=(1 10 7 15 19 2 16 15 15 11 13 9 7 3 12 6 1).
(Ejercicio tomado en el examen final de 9/5/2002).
keywords:lista
FIN DE DESCRIPCION }
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
{$ Id: interca.pas 2003/03/12 16:30 mstorti Exp jdelia $}
{ Supongamos que los elementos son (a,b,c,d,e,....) y en un
cierto momento tenemos una posicion `p' correspondiente
a una posicion par, por ejemplo, la que contiene al
elemento `e'.
* Tomamos la posicion siguiente `q':
a) posicion: p q
| |
v v
L = ( a b c d e f g ........ ) <- elementos
* Guardamos el elemento en la posicion `q' en la variable
`x' y suprimimos esa posicion `q'.
b) posicion: p x : = RECUPERA (q)
|
v
L = ( a b c d e g ........ ) <- elementos
* Insertamos `x' en la posicion `p'. Notar que el
elemento `f' queda en la posicion `p'
c) posicion: p
|
v
L = ( a b c d f e g ........ ) <- elementos
* Avanzamos `p' dos posiciones hasta la siguiente posicion
par. Como sabemos que seguro hay al menos un elemento,
entonces al menos no hay que verificar si el primer
`siguiente' da `fin de lista' o no.
d) posicion: p
|
v
L = ( a b c d f e g ........ ) <- elementos }
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
program intercambia_p;
uses u_listpi;
type
lista = listpi;
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
{ atencion que hay que hacer el recupera *despues* de haber
verificado que `q' no esta en el fin de la lista }
procedure INTERCAMBIA (var L : lista);
var
p, q : posicion;
x : tipo_elemento;
begin
p := L.PRIMERO;
while ( p <> L.FIN ) do begin
q := L.SIGUIENTE (p) ; { ver figura a) arriba }
if (q = L.FIN) then exit;
x := L.RECUPERA (q);
L.SUPRIME (q); { ver figura b) arriba }
L.INSERTA (x,p); { ver figura c) arriba }
p := L.SIGUIENTE (p);
p := L.SIGUIENTE (p); { ver figura d) arriba }
end;
end;
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
var
L : lista;
k : integer;
begin
randomize ;
L.ANULA;
{ Insertamos un cierto numero aleatorio de elmentos }
for k := 1 to (10 + random (10) ) do
L.INSERTA ( random (20), L.FIN );
L.IMPRIME ('Antes de intercambia: ');
INTERCAMBIA (L);
L.IMPRIME ('Despues de intercambia: ');
end.
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
Generated by GNU enscript 1.6.1.