Está en la página 1de 20

Listas en C++

En la vida diaria, sea esta comn, acadmica o profesional, podemos


identificar elementos organizados: personas, objetos, datos o
informacin. Por ejemplo:

Ejemplos de organizacin de elementos


1. En un banco las personas se organizan en
colas para ser atendidas por un cajero.

2. Las cajas en una bodega se organizan en


columnas y/o filas para ser almacenadas.

3. Los huevos de gallina se organizan en


cartones de varias filas y columnas para ser
almacenados.

4. Los corredores de cien metros planos se


organizan en fila para ubicar un lugar en la
pista.

5. Los nombres de los artculos que una


persona va a comprar en un supermercado
se organizan en una lista.

La anterior es una pequea muestra en los que podemos encontrar


organizacin de personas u objetos.

Estas formas de organizar pueden ser modeladas en un lenguaje


algortmico o de programacin considerando los elementos esenciales
que definen dichos agrupamientos; sin embargo, como es natural,
algunos caractersticas de estos conjuntos no podrn ser representados en
el modelo.
Los ejemplos 1, 4 y 5 muestran una organizacin lineal de datos,
mientras que el ejemplo 2 podra referirse a una organizacin
tridimensional y la 3 a una bidimensional.

Por el momento, de los cinco ejemplos anteriores trataremos con


aquellos que guardan similitud con los ejemplos 1, 4 y 5 y les
llamaremos listas.

Para comprender la relevancia del concepto lista al momento de construir


algoritmos se presenta el siguiente ejemplo:

Ejemplo
consideremos la siguiente situacin:
Escribir un programa que permita capturar el nombre de los empleados de una compaa,
luego los ordene en forma ascendente y los muestre.

Para resolver esto se pueden identificar tres grandes tareas: capturar los nombres, ordenar los
nombres y mostrar los nombres.

Para la captura de nombres se puede pensar en el siguiente atributo:


Nombre del empleado: Nom
Dado que hay varios empleados entonces se requiere un ciclo para capturar sus nombres; el siguiente
es una propuesta:
mCaptura (Nom)
{Este algoritmo captura los nombres de los empleados de una
compaa y los devuelve
Resp, toma el valor S si se desea capturar un nombre}
Inicio
Leer Resp
Mientras Resp=S Hacer
Leer Nom
Leer Resp
Fin_Mientras
Fin

Ahora se realiza una representacin de memoria para verificar el algoritmo con los nombres Juan,
Rosa y Jo. Se supone que se tiene una variable global Empleados en la cual se almacenan los
nombres despus de ejecutar la sentencia:
mCaptura(Empleados)

Sentencia Memoria Explicacin


Hasta la sentencia Inicio Se crea la memoria del algoritmo:
Nom Resp El parmetro Nom recibe al
argumento Empleados y
Resp como memoria local
Leer Resp El usuario contesta con S pues se
Nom Resp desea ingresar un nombre
S
Mientras Resp=S Hacer Como Resp tiene el valor S, la
Nom Resp expresin Resp=S toma el
S valor verdadero, por eso se
ejecuta el cuerpo del ciclo
Leer Nom El usuario ingresa un nombre
Nom Resp cuando se ejecuta la sentencia
Juan S
Leer Resp Nuevamente, el algoritmo
Nom Resp pregunta si se desea ingresar un
Juan S nombre, a lo cual el usuario
contesta S, este valor remplaza
al anterior en la memoria de
Resp. El control de flujo pasa al
encabezado del ciclo
Mientras Resp=S Hacer La expresin lgica Resp=S
Nom Resp toma el valor verdadero y se pasa
Juan S al cuerpo del ciclo
Leer Nom El usuario ingresa un nombre
Nom Resp cuando se ejecuta la sentencia,
Rosa S este nuevo valor remplaza al
anterior.

Leer Resp Nuevamente, el algoritmo


Nom Resp pregunta si se desea ingresar un
Rosa S nombre, a lo cual el usuario
contesta S, este valor remplaza
al anterior en la memoria de
Resp. El control de flujo pasa al
encabezado del ciclo
Mientras Resp=S Hacer Como Resp tiene el valor S, la
Nom Resp expresin Resp=S toma el
Rosa S valor verdadero, por eso se
ejecuta el cuerpo del ciclo
Leer Nom El usuario ingresa un nombre
Nom Resp cuando se ejecuta la sentencia,
Jo S este nuevo valor remplaza al
anterior.
Leer Resp Nuevamente El algoritmo
Nom Resp pregunta si se desea ingresar un
Jo N nombre, a lo cual el usuario
contesta N, este valor remplaza
al anterior en la memoria de
Resp. El control de flujo pasa al
encabezado del ciclo
Mientras Resp=S Hacer Como Resp tiene el valor N, la
Nom Resp expresin Resp=S toma el
Jo N valor Falso, por eso se ejecuta
el cuerpo del ciclo
Fin Se destruye la memoria local:
Nom y Resp, pero antes Nom
transfiere su contenido al
argumento Empleados

Qu hay almacenado en el identificador Empleados?


Si observa cuidadosamente, el algoritmo mCaptura solo almacena el ltimo nombre ingresado, ya
que cada nuevo nombre remplaza al anterior; por lo tanto el algoritmo mCaptura no es apropiado.
Sin embargo, ahora sabemos que necesitamos ms memoria, una celda de memoria para cada
nombre de empleado:
mCaptura(Nom1, Nom2, Nom3, )
Cuntas variables como para guardar nombre se necesitan? El problema es que no sabemos
cuantos empleados hay.
Para administrar bien los diferentes identificadores que se requieren para
capturar los nombres y resolver este problema se introduce una nueva
notacin para los identificadores. Pero antes se debe sealar lo siguiente
con relacin al problema original:

Existen varios objetos que comparten el atributo de inters.


Se desea mantener un registro de valores para ese atributo.

En estas condiciones el atributo se representa as:

Nombre de empleado: Nom

Nomi, i=1, 2, 3, , n

Entonces se tiene un identificador (en este caso Nom) que representa a un


conjunto de n-identificadores (Nom1, Nom2, Nom3, , Nomn). La
memoria de ese identificador se puede representar as:

Nom2

Nom
1 2 3 ... n

Entonces cada vez que se hace referencia al identificador Nom


automticamente se hace referencia al conjunto de n-celdas y para hacer
referencia a una celda especfica se agrega al identificador Nom el
subndice correspondiente al nmero de celda de inters.

Ahora el algoritmo mCaptura puede ser modificado como sigue:

Ejemplo
Para la captura de nombres se puede pensar en el siguiente atributo:
Nombre del empleado: Nom
Nomi, i=1, 2, 3, 5
Dado que hay varios empleados entonces se requiere un ciclo para capturarlos; el siguiente es una propuesta:
mCaptura (Nom)
{Este algoritmo captura los nombres de los empleados de una compaa y los
devuelve
Resp, toma el valor S si se desea capturar un nombre
i es un contador para para indicar el nmero de celda en Nom}
Inicio
Hacer i:=0
Leer Resp
Mientras Resp=S Hecer
Hacer i:=i+1
Leer Nomi
Leer Resp
Fin_Mientras
Fin

Ntese que en este caso por conveniencia se asign el valor 5 como el nmero de celdas en Nom; esto se discutir ms
adelante.
Ahora se realiza una representacin de memoria para verificar el algoritmo con los nombres Juan, Rosa y Jo. Se supone que
se tiene una variable global:
Empleados
Empleadosi, i=1, 2, 3, , 5
en la cual se almacenan los nombres despus de ejecutar la sentencia:
mCaptura(Empleados)

Sentencia Memoria Explicacin


Hasta la sentencia Inicio Se crea la memoria del algoritmo:
Nom El parmetro Nom recibe al
1 2 3 4 5 argumento Empleados. Resp
i e i como memoria local

Resp

Hacer i:=0 El algoritmo asigna 0 a i. Luego el


Leer Resp Nom usuario contesta con S pues se
1 2 3 4 5 desea ingresar un nombre
i 0

Resp S

Mientras Como Resp tiene el valor S, la


Resp=S Hacer Nom expresin Resp=S toma el
1 2 3 4 5 valor verdadero, por eso se ejecuta
i 0 el cuerpo del ciclo

Resp S

Hacer i:=i+1 i toma el valor 1, luego el usuario


Leer Nom Nom Juan ingresa un nombre el cual se
1 2 3 4 5 almacena en la celda 1 de Nom
i 1

Resp S
Leer Resp Nuevamente, el algoritmo pregunta
si se desea ingresar un nombre, a
Nom Juan lo cual el usuario contesta S, este
1 2 3 4 5 valor remplaza al anterior en la
i 1 memoria de Resp. El control de
flujo pasa al encabezado del ciclo
Resp S

Mientras La expresin lgica Resp=S


Resp=S Hacer Nom Juan toma el valor verdadero y se pasa
1 2 3 4 5 al cuerpo del ciclo
i 1

Resp S
Hacer i:=i+1 i toma el valor 2, luego el usuario
Leer Nom ingresa un nombre el cual se
Nom Juan Rosa almacena en la celda 1 de Nom.
1 2 3 4 5
i 2

Resp S
Leer Resp Nuevamente, el algoritmo pregunta
si se desea ingresar un nombre, a
Nom Juan Rosa lo cual el usuario contesta S, este
1 2 3 4 5 valor remplaza al anterior en la
i 2 memoria de Resp. El control de
flujo pasa al encabezado del ciclo
Resp S

Mientras Como Resp tiene el valor S, la


Resp=S Hacer Nom Juan Rosa expresin Resp=S toma el
1 2 3 4 5 valor verdadero, por eso se ejecuta
i 2 el cuerpo del ciclo

Resp S
Hacer i:=i+1 i toma el valor 3, luego el usuario
Leer Nom Nom Juan Rosa Jo ingresa un nombre el cual se
1 2 3 4 5 almacena en la celda 1 de Nom.
i 3

Resp S
Leer Resp Nuevamente, el algoritmo pregunta
si se desea ingresar un nombre, a
Nom Juan Rosa Jo lo cual el usuario contesta N, este
1 2 3 4 5 valor remplaza al anterior en la
i 3 memoria de Resp. El control de
flujo pasa al encabezado del ciclo
Resp S
Mientras Como Resp tiene el valor N, la
Resp=S Hacer expresin Resp=S toma el
Nom Juan Rosa Jo valor Falso, por eso se ejecuta
1 2 3 4 5 el cuerpo del ciclo
i 3

Resp S
Fin Se destruye la memoria local: Nom
y Resp, pero antes Nom
transfiere su contenido al
argumento Empleados

Qu hay almacenado en el identificador Empleados? Los nombres que se ingresaron, tal y como se deseaba:

Empleados Juan Rosa Jo


1 2 3 4 5

En este problema que hemos estudiado se destaca el poder de


representacin que puede introducir un cambio de notacin ya que lo
nico que hicimos fue aglutinar todas las celdas de memoria que
necesitbamos bajo un mismo identificador y administramos la cantidad
de memoria por medio de la definicin del subndice.

Posiblemente el lector ha conectado este ejemplo que hemos desarrollado


con los casos de listas 1, 4 y 5 que se presentaron al inicio. De hecho
estos tres ejemplos son casos de la vida real mientras que el ejemplo
desarrollado se utiliz un modelo abstracto de dichos casos.

Modelo de una lista para el lenguaje algortmico


Para construir un modelo abstracto de una lista debemos considerar
aquellos aspectos que son ms relevantes. No existe un nico modelo,
pero en este caso utilizaremos el presentado por Joyanes () como
referencia, pero con una modificacin. Antes de presentar el modelo
procedemos con nuestro anlisis de las listas en la realidad, para ello se
utilizarn las listas presentadas como ejemplos:

Tabla 1. Caractersticas de una lista en el modelo


Mundo real Modelo
1. El ejemplo 4 es un caso en el 1. Entonces podemos asumir
que existe un espacio fijo en que el modelo:
el cual la lista se construye, a) debe constar de un
mientras que para los nmero fijo de espacios
ejemplos 1 y 5 no. de memoria para
almacenar datos o, por
otra parte,
b) el nmero de espacios de
memoria es variable.
Tabla 1. Caractersticas de una lista en el modelo
Mundo real Modelo
2. Como consecuencia de lo 3. Entonces en el modelo
anterior, algunos a) se debe definir un nmero
agrupaciones pueden llenarse mximo de datos
(4) mientras que otras no (1y posibles, o bien
5). b) se pueden disponer de
tantos espacios como se
necesiten.
4. Las agrupaciones pueden ser c) Debe definirse un
unidimensionales, mecanismo para
bidimensionales, representar la dimensin.
tridimensionales, etc.
5. Algunas agrupaciones no d) Debe el modelo
permiten espacios vacos abstracto permitir
entre dos datos consecutivos espacios vacos entre dos
mientras que otras s. datos consecutivos?

Entonces podemos decir que una lista es una sucesin finita de elementos
que guardan una relacin entre s y que les hace pertenecer a esa lista. En
el modelo una lista, L, es un conjunto de tres atributos:

1. Los espacios de memoria, E, en los cuales se puede almacenar


datos de un mismo tipo (donde el tipo queda determinado por
aquellos definidos en el lenguaje).
2. Una celda de memoria, U, para indicar la posicin que ocupa el
ltimo dato en E. Esta cumple varias funciones:
a) Toma el valor cero si la lista est vaca.
b) Si la lista est llena toma el valor igual a la cantidad de
celdas disponibles.
c) Su valor indica la posicin en que est almacenado el ltimo
dato.
d) Su valor indica cuantos datos hay en la lista.
3. Una celda de memoria, N, que indica el nmero de celdas en E.

Ahora bien, en una lista podemos agregar datos, eliminar datos, ordenar
los datos, buscar un dato, etc. Entonces una lista puede ser vista como un
objeto de tres atributos (E, U y N) y un conjunto de operaciones. La clase
Lista puede definirse como:

Lista
E: arreglo
U: nmero natural
N: nmero natural
Crear(L)
EstaVacia(L)
EstaLlena(L)
EstaOrdenada(L)
InserPrim(X ,L)
InserFin(X, L)
Insertar (X, P, L)
Ordenar (L)
Pocision (X, L)
Esta(X,L)
SuprimePos(P, L)
Suprime (X, L)
Sacar(X, L)
Vaciar(L)

Aunque, como se ver, se puede definir muchas ms operaciones

Implementacin de listas en C++


En C++ una lista como la definida anteriormente se puede implementar
de varias formas, unas ms eficientes que otras. A continuacin se
mostrar cmo implementarla a travs de array y estructuras.

Array
En la Tabla 1 se seal que algunas listas tienen un nmero de celdas fijo
mientras que otras tienen tamao variable. El primer caso de listas puede
ser implementadas en C++ mediante array, mientras que para el segundo
se puede utilizar punteros.

El tipo de dato array define identificadores cuya memoria est


constituida por un conjunto de espacios de memoria, cada uno de los
cuales est referenciado por un valor numrico los cuales corresponden
al ndice o posicin del espacio de memoria o celda.

Para declarar una variable de tipo array es necesario indicar el nmero de


celdas y el nmero de dimensiones. La sintaxis para in array lineal es:

tipo_dato identificador[nmero_natural];

Por ejemplo

float x[10];

define a x como un identificador de tipo array de 10 celdas de memoria


en cada una de las cuales se almacenan datos de tipo float.

Supongamos que se desea crear un objeto Array llamada edades de


tamao mximo 10 para almacenar nmeros; la siguiente sentencia lo
permite:

int edades[10];
La memoria del identificador edades as declarado ser como la
siguiente:

edades1

edades
0 1 2 ... 9

Ntese que la primera celda est en la posicin 0 y la dcima celda est


en la posicin 9.

Para asignar datos a un array se debe especificar la celda en que se desea


guardar. La sintaxis es la siguiente:

identificador_array[poscicin] = expresin;

Por ejemplo, si deseamos guardar el dato 34 en la tercer celda del


identificador edades, escribimos:

edades[3] = 34;

edades[3] = 34

Hace referencia al array Hace referencia a una Indica que se debe copiar en
especfico por medio de celda especfica en el la celda sealada por 3 el
su identificador array, en este caso la 1 literal 34

00 11 22 33 ...9
...9
edades 34

Estructuras
En C++ existe un tipo de dato llamado struct, el cual permite crear
definir tipos de datos estructurados. La sintaxis para para definir un tipo
de dato estructurado es la siguiente:

struct identificador_tipo{
tipo_dato identificador_1;
tipo_dato identificador_2;

tipo_dato identificador_n;
}
En la sintaxis anterior identificador_tipo pasara a ser un nuevo
tipo de dato y identificador_1, identificador_2,
identificador_n seran sus campos o atributos. Cada campo es un
identificador con memoria, pero el identificador de la estructura no tiene
memoria; ms bien define la memoria de identificadores declarados de su
tipo.

Implementacin de listas en C++


Ahora se presenta una forma de implementar listas mediante array en
C++. Recurdese que la lista en lenguaje algortmico se defini como un
conjunto de tres atributos, uno de los cuales, E, es una sucesin finita de
celdas. Entonces si L es una lista, su memoria es:

1 2 3 4 5
L E
U
N

Para definir una lista de tamao 10 de nmeros reales en C++ se


escribira lo siguiente

struct lista_simple{
float e[10];
int u;
int n;
}

Ahora bien, en general un tipo de dato no solo define la memoria de los


identificadores declarados de ese tipo sino tambin las operaciones
vlidas sobre esos identificadores.

Hasta ahora hemos definido cundo un elemento es de tipo


lista_simple. Ahora debemos definir las operaciones sobre
elementos de este tipo. Para ello es necesario conocer los posibles
estados de una lista y luego ver como acta cada operacin segn el
estado. Una lista puede estar en uno de tres estados segn su capacidad
para almacenar datos:

1. Vaca
Segn la definicin una lista est vaca si su atributo campo u tiene
el valor 0.
2. Llena
Segn la definicin una lista est llena si su atributo u es igual al
atributo n.
3. Ni vaca ni llena.
Una lista no est vaca ni llena si u es mayor que 0 pero menor que
n.

Entonces es conveniente contar con operaciones que informen acerca de


cual es el estado de la lista. A continuacin se presenta la creacin de la
operacin EstaVacia:

Ejemplo. funcin EstaVacia(L)


A continuacin se presenta la especificacin de la operacin EstaVacia, luego se muestra como se
programa en Smalltalk como un mtodo para la clase Lista.

EstaVacia(L)
Es un mtodo que devuelve el valor verdadero si L est vaca o falso en caso contrario.

A. Anlisis
El atributo U de L toma el valor 0 cuando est vaca, entonces la expresin lgica L.U=0 toma el valor
verdadero si L est vaca.

B. Diseo

EstaVacia(L)
{Es un mtodo que devuelve el valor verdadero si L est vaca o falso en caso contrario.}
Inicio

EstaVacia=L.U=0

Fin

C. Desarrollo

bool esta_vacia(lista_simple lista){


/*Este mtodo devuelve true si lista est vaca o false
en caso contrario
Autor: */

return lista.u == 0;
}

De las operaciones que se suelen realizar sobre una lista estn la


insercin de elementos, eliminacin de elementos, ordenacin de la lista,
bsqueda de elementos en la lista, entre otros. En los ejemplos siguientes
se presentarn algunas de estas operaciones, el resto se deja como tarea
al lector.

Operaciones de insercin
Existen muchos criterios para definir una operacin de insercin en una
lista, sin embargo nosotros trataremos tres: insertar al inicio, entre y al
final. A continuacin se explica la insercin al inicio:
Ejemplo. Mtodo InserPrim(X, L)
InserPrim(X, L)
Es un mtodo que inserta en la celda 1 de L el contenido de X.

A. Anlisis
Una lista puede estar en tres estados: vaca, llena y ni llena ni vaca. Nuestra tarea consiste en
determinar cmo acta la operacin InserPrim en cada caso.

1 2 3 4 5
L E
Si L est vaca entonces se guarda el contenido
de X en la primera celda de E y U incrementa
U 0 en 1.
N 5

1 2 3 4 5
L E a b c d e Si L est llena, entonces no es posible insertar
el contenido de X en L.
U 5
N 5
Si L no est ni vaca ni llena, entonces para
1 2 3 4 5 insertar el contenido de X en L es necesario
L E a b c librar la celda 1 de E. Para ello, se puede mover
el elemento de la posicin 3 de E a la posicin
U 3
4, luego el de la posicin 2 a la 3 y luego el de
N 5 la 1 a la 2.
Esto implica que se requiere recorrer la lista (o
parte de la lista) de forma secuencias. Esto
obliga a utilizar un ciclo y un contador.

Ntese que no importa si la lista est vaca o tiene espacio disponible, el valor de X siempre se almacena
en la celda 1 de E y se debe incrementar en 1 el valor de U.

B. Diseo

InserPrim(X, L)
{ Es un mtodo inserta el contenido de X en la primera celda de E
j es un contador para recorrer la lista}
Inicio

No EstaLlena(L) No

Si

No EstaVacia(L) No Lista llena, no se guard


el dato

Si

j=L.U

L.Ej+1:=L.Ej

j:=j-1

Si J 1

No

L.E1:=X
L.U:=L.U+1

Fin

C. Desarrollo

void inser_prim(float dato, lista_simple &lista){


/*Este mtodo inserta al inicio de lista el contenido
del parmetro dato
Autor: */
if(!esta_llena(lista)){
lista.e[lista.u] = dato;
lista.u = lista.u + 1;
}
else{cout<<'Lista llena, no se guard el dato'<<endl;}
}

Otro conjunto de operaciones importante es el referente a operaciones


para eliminar datos de la lista. Algunas operaciones de uso frecuente son:
eliminar un dato X, eliminar un dato que est en la posicin P. A
continuacin se explica esta ltima:
Ejemplo. Mtodo SuprimePos(P, L)
SuprimePos(P, L)
Es un mtodo elimina de L el dato que est en la posicin P.

A. Anlisis
Una lista puede estar en tres estados: vaca, llena y ni llena ni vaca. Nuestra tarea consiste en determinar cmo
acta la operacin SuprimePos en cada caso. Suponga que P es igual a 2.

1 2 3 4 5
L E Si L est vaca entonces no se puede eliminar
ningn dato, pero adems se cumple que P>U.
U 0
N 5

Si L est llena, entonces se puede eliminar el


dato solo si 1PL.U. En este caso, la forma de
1 2 3 4 5 eliminar es corriendo todos los datos cuya
L E a b c d e posicin es mayor que P una celda hacia P.
Esto implica que se requiere de un ciclo y un
U 5 contador para recorrer todo o parte de E.
N 5

1 2 3 4 5
L E a b c Si L tiene espacio entonces se puede eliminar
U 3
el dato solo si 1PL.U. en este caso se
procede de la misma forma que en el caso
N 5 anterior.

Ntese que si P<1 P>L.U no es posible eliminar el dato. Adems, cuando L est vacia se cumple la condicin
anterior.

B. Diseo

SuprimePos(P, L)
{ Es un mtodo elimina de L el elemento en la posicin P
j es un contador para recorrer la lista}
Inicio

1PL.U No

Si

j:=p
La lista est vaca o
, p, no es vlido
L.Ej:=L.Ej+1

j:=j+1

Si J<L.U

No

L.U:=L.U-1

Fin

C. Desarrollo

void suprime_pos(int pos, lista_simple &lista){


/*Este mtodo elimina de lista el elemento de la posicin pos
I es un contador para recorrer lista*/
int j;
if(0 <= pos && pos <= lista.u-1){
j:=pos;
while(j < lista.u-1){
lista.e[j] = lista.e[j+1]
j:=j+1.
}
lista.u = lista.u - 1;
}
else{cout<<'La posicin dada no es vlida'<<endl;}
}

En ocasiones es importante ordenar los elementos de una lista. Existen


varias operaciones para ordenar listas. A continuacin se explica cmo
programar la ordenacin conocida como burbujeo:

Ejemplo. Mtodo OrdenarMenor(P, L)


Ordenarmenor(P, L)
Es un mtodo ordena los elementos de una lista desde el menor hasta el mayor.

A. Anlisis
Se implementar la tcnica conocida como burbujeo, la cual consiste en la aplicacin reiterada de un
intercambio simple.
Una lista puede estar en tres estados: vaca, llena y ni llena ni vaca. Nuestra tarea consiste en
determinar cmo acta la operacin OrdenarMenor en cada caso:

1 2 3 4 5
L E
Si L est vaca entonces no se puede ordenar.
U 0
N 5

Si L est llena, entonces se puede ordenar.


1 2 3 4 5 Para ello se aplica el intercambio simple a cada
L E c e a d b par consecutivo de elementos hasta llegar al
final de la lista.
U 5
N 5

1 2 3 4 5
L E b c a Si L no est vaca ni llena, entonces se puede
ordenar. Se debe aplicar intercambio simple a
U 3
cada par consecutivo de elementos hasta llegar
N 5 al ltimo elemento.

Ntese los dos ltimos casos funcionan de forma similar, por lo tanto se puede trabajar como si
fuera el mismo caso.

Cmo funciona el intercambio simple?

En la lista siguiente es necesario intercambiar el contenidos de las celdas 1 y 2 por que L.E 1<L.E2 es
falso

1 2 3 4 5
L E e c a d b
U 5
N 5

Pero si pasamos el contenido de la segunda celda a la primera se borrar el contenido de sta


ltima

1 2 3 4 5
L E c c a d b
U 5
N 5

Para evitar esto se utiliza una memoria auxiliar que permita realizar el intercambio.
Primero el contenido de la celda dos para a la memoria auxiliar A, luego el contenido de la celda 1
para a la celda 2, y finalmente el contenido de A pasa a la celda 1.
A c

1 2 3 4 5
L E c e a d b
U 5
N 5

El equivalente de este proceso en el algoritmo es:


Hacer A:=L.E2
Hacer L.E2:=L.E1
Hacer L.E1:=A
El problema de aplicar el intercambio simple es que pueden quedar fragmentos de la lista en
desorden; tal como se muestra en la lista anterior cuando se aplica el intercambio simple a toda la
lista:

1 2 3 4 5
L E c a d b e
U 5
N 5

Para evitar este problema lo que se hace es volver aplicar intercambio simple a la lista hasta que no
ocurran intercambios.
Segn lo anterior, se requiere de:
Un ciclo para aplicar el intercambio
Una o ms iteraciones
Cambio=V para continuar; es decir se requiere de una bandera (Cambio) la cual toma el
valor verdadero siempre que se aplique un intercambio.
Otro ciclo anidado en el primero para recorrer la lista aplicando intercambios
Una o ms iteraciones (de hecho, si la lista tiene L.U elementos el ciclo tendr L.U-1
iteraciones)
j<L.U para continuar.

B. Diseo

OrdenarMenor(L)
{ Es un mtodo ordenar los elementos de L de menor a mayor
j es un contador para recorrer la lista
Cambio es una bandera que toma el valor V si ocurren cambios o F en caso contrario}
Inicio

No EstaVacia(L) No

Si

Cambio=F La lista est vacia

j:=1

L.Ej>L.Ej+1 No

Si

Cambio:=V
A:=L.Ej+1
L.Ej+1:=L.Ej
L.Ej:=A

j:=j+1

Si j<L.U

No

Si Cambio

No

Fin

C. Desarrollo

void ordenar_menor(lista_simple &lista){


/*Este mtodo ordena una lista de menor a mayor
aux es un identificador auxiliar para el intercambio
cambio es una bandera que indica si hubo intercambio
j es un cantador para recorrer lista
Autor: */
float aux;
bool cambio;
int j;
if(!esta_vacia(lista){
cambio = true;
while(cambio){
cambio=false;
for(j=0, j <= lista.u-1, j++){
if(lista.e[j] > lista.e[j+1]){
cambio = true;
aux = lista.e[j+1];
lista.e[j+1] = lista.e[j];
lista.e[j] = aux;
};
}
}
}
else{cout<<'La lista est vaca'<<endl;}
}