Está en la página 1de 47

Programación y

Algoritmia

Un enfoque práctico y didáctico


para el diseño de algoritmos

5 Algoritmos Puntuales

Lic. Oscar Ricardo Bruno, MDU


Contenido
ALGORITMOS PUNTUALES ___________________________________________ 3
Acciones y funciones para vectores_____________________________________ 3
Acciones y funciones para archivos ___________________________________ 12
Acciones y funciones para pilas_______________________________________ 16
Acciones y funciones para Colas ______________________________________ 17
Acciones y funciones para Listas Ordenadas enlazadas ___________________ 18
Acciones y funciones para arboles ____________________________________ 27
Inserciones en arboles AVL __________________________________________ 32
Funciones recursivas _______________________________________________ 32
Archivos en pascal _________________________________________________ 35
Ejemplo en C con aplicaciones de estructuras enlzadas ___________________ 40
ANEXO 1 Representaciones gráficas de algoritmos_________________________ 42
Diagrama de Nassi-Sneiderman ______________________________________ 42
Diagramas de Jackson ______________________________________________ 42
Diagramas de Lindsay.______________________________________________ 43
Llaves de Warniel __________________________________________________ 44
Notación Algoritmica _______________________________________________ 44
Equivalencias entre notación algorítmica y lenguajes de programación _____ 45
Estilos de Indentación ______________________________________________ 45
BIBLIOGRAFIA _____________________________________________________ 47
ALGORITMOS PUNTUALES
Objetivos de aprendizaje
Dominando los temas del presente capitulo Usted podrá.
1. Evaluar algoritmos puntuales aplicables a distintas estructuras de datos.
2. Conocer las precondiciones para la utilización de algoritmos puntuales

Introducción
Se describen a continuación un conjunto de algoritmos puntuales para el manejo de
estructuras estáticas y dinámicas. Con una descripción breve de las precondiciones y
poscondiciones, utilizando definiciones genéricas para todos los casos

Definiciones de tipos
Definiciones de los tipos de datos utilizados en los algoritmos que se describen
MAX_FIL = 100;
Tinfo = TIPO Entero;
TinfoC = TIPO <C1 : Td1, C2 : Td2>
TVector = TIPO Tabla [1,MAX_FIL] de Tinfo;
TPNodo = TIPO Apuntador a Nodo;
Nodo = TIPO <Info : Tinfo; sgte : TPNodo>
Arbol = TIPO <Info : Tinfo; Izq, Der : TPArbol>

Acciones y funciones para vectores


BusqSecEnVector(Dato V: Tvector; Dato N: Entero; Dato Clave:Tinfo;
Dato_resultado Posic: Entero): una accion
Usar este algoritmo si alguna de las otras búsquedas en vectores mas eficientes no son
posibles, recordando que búsqueda directa tiene eficiencia 1, búsqueda binaria es
logarítmica y búsqueda secuencial es de orden N
PRE: V: Vector en el que se debe buscar
Clave : Valor Buscado
N: Tamaño lógico del vector
POS: Posic: Posición donde se encuentra la clave, 0 (Cero) si no esta.
LEXICO
j : Entero; Controla No superar el tamaño fisico del vector j<= MAX_FIL
No leer mas alla del ultimo elemento logico cargado j <= N
ALGORITMO Salir si es que encuentra la clave buscada V[j] <> clave
Posic = 0;
j = 1; //Pone el indice en la primera posición para recorrer el vector//
MIENTRAS (j <= MAX_FIL y j <= N y V[j] <> Clave) HACER
Inc (j) //Incrementa el indice para avanzar en la estructura//
FIN_MIENTRAS;
SI (j > N)
ENTONCES
Posic =0 // No encontró la clave buscada
SI_NO
Posic = j // Encontró la clave en la posición de índice j
FIN_SI;

FIN. // Búsqueda secuencial En Vector


BusqMaxEnVector(Dato V: Tvector; Dato N: Entero; Dato_resultado Maximo :Tinfo;
Dato_resultado Posic: Entero): una acccion
PRE: V: Vector en el que se debe buscar (sin orden)
N : Tamaño lógico del vector
POS: Posic: Posición donde se encuentra el máximo
Maximo : Valor máximo del vector.
LEXICO
j : Entero; Supone que el maximo es el primer valor del vector por lo que le asigna ese
ALGORITMO valor a maximo y la posición 1 a la posición del maximo. Al haber leido solo un
elemento supone ese como maximo
Posic = 1;
Maximo = V[1];
PARA j [2, N] HACER Recorre ahora las restantes posiciones del vector, a partir de la
SI (v[j] > Maximo) segunda y lcada vez que el valor leido supera al maximo
contiene ese valor como maximo y el indice actual como posición
ENTONCES del maximo
Posic = j;
Maximo = v[j];
FIN_SI;
FIN_PARA;

FIN. // Búsqueda máximo En Vector

BusqMinDistCeroEnVector(Dato V: Tvector; Dato N: Entero; Dato_resultado


Minimo :Tinfo; Dato_resultado Posic: Entero): una acccion
PRE: V: Vector en el que se debe buscar (sin orden)
N : Tamaño lógico del vector, existe al menos un valor <> de cero
POS: Posic: Posición donde se encuentra el minimo distinto de cero
Minimo : Valor minimo distinto de cero del vector.
LEXICO
i,j : Entero; Recorre el vector hasta encontrar el primero distinto de cero.
ALGORITMO Al encontrarlo supone ese valor como minimo y el valor del
indice como posición del minimo
//
J = 1;
Mientras (J<=N) Y (V[j] = 0) Hacer
Incrementar[j];
Posic = J;
Minimo = V[j];
PARA j [Posic.+1 , N] HACER Recorre el vector desde la posición inmediata
siguiente hasta la ultima desplazando el minimo
SI (v[j]<> 0 Y v[j] < Minimo) solo si el valor es distinto de cero y, ademas,
ENTONCES menor que el minimo
Posic = j;
Minimo = v[j];
FIN_SI;
FIN_PARA;

FIN. // Búsqueda minimo distinto de cero En Vector

BusqMaxySiguienteEnVector(Dato V: Tvector; Dato N: Entero; Dato_resultado


Maximo :Tinfo; Dato_resultado Posic: Entero, Dato_resultado Segundo :Tinfo;
Dato_resultado PosicSegundo: Entero): una accion
PRE: V: Vector en el que se debe buscar
N : Tamaño lógico del vector mayor o gual a 2
POS: Posic: Posición donde se encuentra el máximo, PosicSegundo: Posición donde se
encuentra el siguiente al máximo
Maximo : Valor máximo del vector. Segundo : Valor del siguiente al máximo del vector
LEXICO
j : Entero;
ALGORITMO
SI V[1] > V[2]
ENTONCES
Posic = 1;
Maximo = V[1]; Se tiene como precondicion que al menos hay dos
PosicSegund = 2; valores. Se verifica el valor que esta en la primera
posición y se lo compara con el que esta en la
Segundo = V[2]; segunda posición, en el caso de ser mayor, el
SINO maximo es ese valor, posición del máximo es uno,
Posic = 2; el segundo el valor que esta en segundo lugar y
posición del segundo es 2. En caso contrario se
Maximo = V[2]; establece como maximo el valor de la segunda
PosicSegund =1; posición y segundo el de la primera.
Segundo = V[1];

FIN_SI

PARA j [3, N] HACER Se verifica luego desde la tercera


SI (v[j] > Maximo) posición hasta el final. En el caso
que el nuevo valor sea mayor que
ENTONCES el maximo, se debe contener el
Segundo = Maximo; anterior maximo en el segundo y al
PosicSegundo = Posic; maximo se le asigna el nuevo
valor. Cosa similar hay que hacer
Posic = j; con las posiciones. Si esto no
Maximo = v[j]; ocurriera se debe verificar si el
SINO nuevo valor supera al segundo, en
ese caso debera desplazarlo
SI Maximo>Segundo
ENTONCES
Segundo = V[j];
PosicSegundo = j
FIN_SI
FIN_SI;
FIN_PARA;

FIN. // Búsqueda máximo En Vector

CargaSinRepetirEnVectorV1(Dato_Resultado V: Tvector; Dato_Resultado N: Entero;


Dato Clave:Tinfo; Dato_resultado Posic: Entero; Dato_resultado Enc : Booleano): una
accion
Utilizar este algoritmo si la cantidad de claves diferentes es fija, se dispone de memoria
suficiente como para almacenar el vector y la clave no es posicional(es decir clave e
índice no se corresponden directamente con posición única y predecible.Si la posición
fuera unica y predecible la busqueda debe ser directa
PRE: V: Vector en el que se debe buscar
Clave : Valor Buscado
N : Tamaño lógico del vector
POS: Posic: Posición donde se encuentra la clave, o donde lo inserta si no esta.
Retorna
0 (cero) en caso que el vector esta completo y no lo encuentra
Enc : Retorna True si estaba y False si lo inserto con esta invocación
Carga vector sin orden
LEXICO
j : Entero;
Controla No superar el tamaño fisico del vector j<= MAX_FIL
ALGORITMO/ No leer mas alla del ultimo elemento logico cargado j <= N
Posic = 0; Salir si es que encuentra la clave buscada V[j] <> clave
J = 1;
MIENTRAS (j <= MAX_FIL y j <= N y V[j] <> Clave) HACER
Inc (j)
FIN_MIENTRAS; Si debio superar el tamaño fisico maximo del vector no pudo
SI j > MAX_FIL cargarlo y retorna cero como señal de error
ENTONCES
Posic = 0 Si encontro un dato o lo debe cargar esto es en el indice j por lo
SI_NO que a pos se se asigna ese valor. En el caso que j sea mayor que
n significa que recorrio los n elemntos cargados del vector, tiene
Posic = j: estpacio por lo que debe cargar el nuevo en la posición j. En este
SI (j > N) caso, y al haber un elemento nuevo debe incrementar n que es el
ENTONCES identificador que controla el tamaño logico del vector
Enc =FALSE; // No encontró la clave buscada
Inc(N);
V[N] = Clave;
SI_NO
Enc = True // Encontró la clave en la posición de índice j
FIN_SI;
FIN_SI
FIN. // Carga sin repetir en vector

BusquedaBinariaEnVectorV1(Dato V: Tvector; Dato N: Entero; Dato Clave:Tinfo;


Dato_resultado Posic: Entero; Dato_resultado Pri : Entero): una accion
Utilizar este algoritmo si los datos en el vector están ordenados por un campo clave y
se busca por ese campo. Debe tenerse en cuenta que si la clave es posicional se deberá
utilizar búsqueda directa ya que la diferencia en eficiencia esta dada entre 1, para la
búsqueda directa y log2N para la binaria
PRE: V: Vector en el que se debe buscar con clave sin repetir
Clave : Valor Buscado
N : Tamaño lógico del vector
POS: Posic: Posición donde se encuentra la clave, o 0 (cero) si no esta
Pri : Retorna la posición del limite inferior

LEXICO Establece valores para las posiciones de los elementos del vector, Pri
j : Entero; contiene el indice del primero, es decir el valor 1, U el indice del ultimo
elemento logicio, es decir N. Ademas se coloca en Posic. El valor cero,
u,m : Entero; utilizando este valor como bandera para salir del ciclo cuando encuentar
ALGORITMO el valor buscado
Posic = 0;
Pri = 1;
U = N;
MIENTRAS (Pri < = U y Pos = 0) HACER
M = (Pri + U ) div 2 Permanece en el ciclo mientras no encuentre lo
buscado, al encontrarlo le asigna a pos el indice
donde lo encontro, como es un valor > que cero
hace false la expresión logica y sale del ciclo. Si no
lo encuentra, y para evirtar ciclo infinito verifica
que el primero no tome un valor mayor que el
ultimo. Si eso ocurre es que el dato buscado no esta
y se debe salir
SI V[M] = Clave
ENTONCES
Posic = M;
SI_NO
SI Clave > V[M]
ENTONCES
Pri = M+1
SI_NO
U=M–1 Si el dato buscado lo encuentra le asigna a posición
FIN_SI el indice para salir. Si no lo encuentra verifica si
esmayor el dato buscabo a lo que se encuentra
FIN_SI revisa en la mitad de los mayores por lo que le
FIN_MIENTRAS; asigna al primero el indice siguiente al de la mitad
dado que alli no estab y vuelve a dividir el conjunto
de datos en la mitas, de ser menor pone como tome
FIN. // Búsqueda binaria en vector ultimo el anterior al de la mitad actual

BusquedaBinariaEnVectorV2(Dato V: Tvector; Dato N: Entero; Dato Clave:Tinfo;


Dato_resultado Posic: Entero; Dato_resultado Pri : Entero): una acccion
PRE: V: Vector en el que se debe buscar clave puede estar repetida
Clave : Valor Buscado
N : Tamaño lógico del vector
POS: Posic: Posición donde se encuentra la primera ocurrencia de la clave.
0 (cero) si no esta.
Pri : Retorna la posición del limite inferior

LEXICO
j : Entero;
u,m : Entero;
ALGORITMO
Posic = 0; La busqueda es bastante parecida a lo
Pri = 1; desarrollado anteriormente, pero en pos debe
tener la primera aparicion de la clave buscada
U = N; que puede repetirse.
MIENTRAS (Pri < U ) HACER En la busqueda anterior utilizabamos esta pos
M = (Pri + U ) div 2 como bandera, para saber cuando Sali si lo
encontro. En este caso si lo utilizamos con el
SI V[M] = Clave mismo proposito saldria cuando encuentra un
ENTONCES valor oincidente con la clave que no
Posic = M; necesariamente es el primero, por lo que esa
condicion se elimina. Al encontrarlo en m se le
Pri = M; asigna ese valoe a pos, alli seguro esta. No
SI_NO sabemos si mas arriba vuelve a estar por lo que
SI Clave > V[M] se asigna tambien esa posición al ultimo para
seguir iterando y ver si lo vuelve a encontrar.
ENTONCES Debe modificarse el operador de relacion que
Pri = M+1 compara primero con ultimo para evitar un
SI_NO ciclo infinito, esto se hace eliminando la
relacion por igual. Insisto en el concepto de los
U=M–1 valores de retorno de la busqueda binaria. Una
FIN_SI particularidad de los datos es que si lo que se
FIN_SI busca no esta puede retornal en el primero la
posición donde esa clave deberia estar
FIN_MIENTRAS;

FIN. // Búsqueda binaria en vector


CargaSinRepetirEnVectorV2(Dato_Resultado V: Tvector; Dato_Resultado N: Entero;
Dato Clave:Tinfo; Dato_resultado Posic: Entero; Dato_resultado Enc : Booleano): una
acccion
PRE: V: Vector en el que se debe buscar ordenado por clave
Clave : Valor Buscado
N : Tamaño lógico del vector
La busqueda es bastante parecida a lo desarrollado anteriormente, pero en pos debe tener la primera
aparicion de la clave buscada que puede repetirse.
En la busqueda anterior utilizabamos esta pos como bandera, para saber cuando Sali si lo encontro.
En este caso si lo utilizamos con el mismo proposito saldria cuando encuentra un valor oincidente
con la clave que no necesariamente es el primero, por lo que esa condicion se elimina. Al encontrarlo
en m se le asigna ese valoe a pos, alli seguro esta. No sabemos si mas arriba vuelve a estar por lo que
se asigna tambien esa posición al ultimo para seguir iterando y ver si lo vuelve a encontrar. Debe
modificarse el operador de relacion que compara primero con ultimo para evitar un ciclo infinito,
esto se hace eliminando la relacion por igual. Insisto en el concepto de los valores de retorno de la
busqueda binaria. Una particularidad de los datos es que si lo que se busca no esta puede retornal en
el primero la posición donde esa clave deberiaestar
POS: Posic: Posición donde se encuentra la clave, o donde lo inserta si no esta.
Retorna
0 (cero) en caso que el vector esta completo y no lo encuentra
Enc : Retorna True si estaba y False si lo inserto con esta invocación
Carga vector Ordenado
LEXICO Al estar el vector ordenadola busqueda puede ser binaria, si lo
encuentra retorna en posición un valor mayor a cero. Si no lo
j : Entero; encuentra el valor de posición sera cero. En este caso, se conoce
ALGORITMO que en pri es en la posición donde este valor debe estar
Enc = True;
BusquedaBinariaEnVectorV(V; N; Clave; Posic; Pri)
SI (Posic = 0)
ENTONCES
Enc = False ; Se produce un desplazamiento de los valores
desde el ultimo hasta el valor de pri
Posic = Pri; corriendolos un lugar para poder insertar en
PARA j [N, Pri](-) HACER la posición pri el nuevo valos. Al pasar por
V[j+1] = V[j]; aquí se inserto un nuevo elemento por lo que
n, que contiene la cantidad de elementos del
FIN_PARA; vector debe incrementarse en uno
V[Pri] = Clave;
Inc(N);
FIN_SI
FIN. // Carga sin repetir en vector Versión 2. con vector ordenado

OrdenarVectorBurbuja(Dato_Resultado V: Tvector; Dato N: Entero): una acccion


Pre: V: Vector en el que se debe ordenar, se supone dato simple
N : Tamaño lógico del vector
POS: Vector ordenado por clave creciente
Usar este algoritmo cuando los datos contenidos en un vector deben ser ordenados. Se
podría por ejemplo cargar los datos de un archivo al vector, ordenar el vector
recorrerlo y generar la estructura ordenada. Para esto la cantidad de elementos del
archivo debe ser conocida y se debe disponer de memoria suficiente como para
almacenar los datos. Una alternativa, si la memoria no alcanza para almacenar todos
los datos podría ser guardar la clave de ordenamiento y la referencia donde encontrar
los datos, por ejemplo, la posición en el archivo.
La idea general es ir desarrollando pasos sucesivos en cada uno de los cuales ir
dejando el mayor de los elementos en el último lugar. En el primer paso se coloca el
mayor en la ultima posición, en el paso siguiente se coloca el que le sigue sobre ese
y asi hasta que queden dos elemntos. En ese caso al acomodar el segundo el otro
queda acomodado el primer ciclo cuenta los pasos, son uno menos que la cantidad
de elementos porque el ultimo paso permite acomodar 2 elementos, por eso el ciclo
se hace entre 1 y N – 1 siendo n la cantidad de elementos
LEXICO
I,J, : Entero;
Aux : Tinfo;
ALGORITMO
PARA i [1, N - 1] HACER
PARA j [1, N - i] HACER
SI (v[j] > v[j + 1])
ENTONCES
Aux = v[j]; Para poder colocar el mayor al final es necesario
hacer comparaciones. Se compara el primero con el
V[j] = v[j + 1]; segundo y si corresponde se intercambian. Asi hasta
V[j + 1] = Aux; llegar al ante ultimo eleemento que se lo compara
FIN_SI; con el últim.
Al ir recorriendo los distintos pasos, y dado que en
FIN_PARA; cada uno se acomoda un nuevo elemento
FIN_PARA; corresponde hacer una comparación menos en cada
FIN avance, como los pasos los recorremos con i, las
comparaciones seran n – i. disminuye en 1 en cada
paso

OrdenarVectorBurbujaMejorado(Dato_Resultado V: Tvector; Dato N: Entero): una


acccion
PRE: V: Vector en el que se debe ordenar, se supone dato simple
N : Tamaño lógico del vector
POS: Vector ordenado por clave creciente

LEXICO
I,J, : Entero;
Aux : Tinfo;
Ord : Boolean;
ALGORITMO El algoritmo es similar al anterior, solo que
I = 0; el ciclo de repetición externo no lo hace si es
REPETIR que tiene la certeza, en el paso anterior que
los datos ya estan ordenados. Es por eso que
Inc(i); agrega una bandera para verificar si ya esta
Ord = TRUE; ordenado y cambia el cilo exactp por un
PARA j [1, N - i] HACER ciclo pos condicional. Es decir reemplaza la
composición para por la composición repetir
SI (v[j] > v[j + 1]) hasta
ENTONCES
Ord = False;
Aux = v[j];
V[j] = v[j + 1];
V[j + 1] = Aux;
FIN_SI;
FIN_PARA;
HASTA ( Ord o I = N – 1);
FIN

OrdenarVectorInserion(Dato_Resultado V: Tvector; Dato N: Entero): una accion


PRE: V: Vector en el que se debe ordenar, se supone dato simple
N : Tamaño lógico del vector
POS: Vector ordenado por clave creciente
Este algoritmo consta de los siguientes pasos
El primer elemento A[0] se lo considera ordenado; es decir se considera el array con
un solo elemento.
Se inserta A[1] en la posicion correcta, delante o detras de A[0] segun sea mayor o
menor.
Por cada iteracion, d i desde i=1 hasta n-1, se explora la sublista desde A[i-1] hasta
A[0],buscando la posicion correcta de la insercion ; a la vez se mueve hacia abajouna
posicion todos los elementos mayores que el elemento a insertar A[i] para dejar vacia
la posicion.
Insertar el elemento en l posicion correcta.

LEXICO
I,J, : Entero;
Aux : Tinfo;

ALGORITMO
PARA I[1..N-1]
J = I;
Aux = A[i] ;
MIENTRAS (J >0 Y AUX < A[J - 1])HACER
A[J] = A[J - 1] ;
Dec(J) ;
FIN MIENTRAS ;
A[J] = Aux ;
FIN PARA;
FIN

OrdenarVectorShell(Dato_Resultado V: Tvector; Dato N: Entero): una acccion


PRE: V: Vector en el que se debe ordenar, se supone dato simple
N : Tamaño lógico del vector
POS: Vector ordenado por clave creciente
Este algoritmo consta de los siguientes pasos
Dividir la lista original en n/2 grupos de dos, considerando un incremento o salto entre
los elementos en n/2.
Analizar cada grupo por separado comparandolas parejas de elementos, y si no estan
ordenados, se intercambian .
Se divide ahora la lista en la mitad n/4, con un incremento tambien en n/4 y nuevamente
se clasifica cada grupo por separado.
Se sigue dividiendo la lista en la mitad de grupos que en el paso anterior y se clasifica
cada grupo por separado.
El algoritmo termina cuando el tamaño del salto es 1.

ALGORITMO
Intervalo = n / 2;

MIENTRAS Intervalo > 0 HACER


PARA I [Intervalo + 1 .. N] HACER
MIENTRAS (J > 0) HACER
K = J + Intervalo;
SI (A[J] <= A[K]
ENTONCES
J = -1
SINO
Intercambio(A[J] ,A[K]) ;
J = J – Intervalo ;
FINSI ;
FIN PARA ;
FIN MIENTRAS;
FIN.

CorteDeControlEnVector(Dato V:Tvector; Dato N: Entero): una acccion


Usar este procedimiento solo si se tienen los datos agrupados por una clave común y se
requiere procesar emitiendo información por cada subconjunto correspondiente a cada
clave.
PRE: V: Vector en el que se debe Recorrer con corte de control
Debe tener un elemento que se repite y estar agrupado por el.
N : Tamaño lógico del vector
POS: Recorre agrupando por una clave

LEXICO
I : Entero;

ALGORITMO
I = 1;
Anterior = TipoInfo;
// Inicializar contadores generales
MIENTRAS (I<=N) Hacer
//inicializar contadores de cada sublote
Anterior = V[i]
MIENTRAS (I<=N Y Anterior = V[i] HACER
// Ejecutar acciones del ciclo

I = I+1 // avanza a la siguiente posición


FIN_MIENTRAS
// Mostrar resultados del sublote
FIN_MIENTRAS
// Mostrar resultados generales
FIN

ApareoDeVectores(Dato V1,v2:Tvector; Dato N1,N2: Entero): una acccion


Utilizar este procedimiento si se tiene mas de una estructura con un campo clave por el
que se los debe procesar intercalado y esas estructuras están ORDENADAS por ese
campo común.
PRE: V1,V2: Vectores a Recorrer mezclados o intercalados
Los vectores deben estar ordenados.
N1,N2 : Tamaño lógico de los vectores
POS: Muestra la totalidad de los datos con el orden de las estructuras
LEXICO
I,J : Entero;
ALGORITMO
I = 1;
J = 1;

MIENTRAS (I<=N1 o J<=N2) Hacer


SI((J > N2) o ((I<=N1) y (V1[I]<V2[J])) HACER
ENTONCES
Imprimir (V1[I]);
I = I + 1;
SINO
Imprimir(V2[J]);
J = J + 1;
FIN_SI;
FIN_MIENTRAS

FIN

CargaNMejoresEnVector(Dato_Resultado V: Tvector; Dato_Resultado N: Entero;


Dato Clave:Tinfo): una acccion
PRE: V: Vector en el que se debe buscar e insertar los mejores
Clave: Valor Buscado
N: Tamaño lógico del vector
POS: Vector con los N mejores sin orden
LEXICO
j : Entero;
Maximo: Tinfo
Posic: Entero;
ALGORITMO
SI (N < MAX-FIL)
ENTONCES
Inc (N);
V[n] = Clave
SI_NO
BusqMaxEnVector(V; N; Maximo :Tinfo; Posic: Entero);
SI (Clave > Maximo)
ENTONCES
V[Posic] = Clave;
FIN_SI;
FIN_SI;
FIN. // Carga los N mejores en vector

Acciones y funciones para archivos


Se identifican dos tipos de archivos, archivos de texto y archivos biarios. Los archivos
de texto son un conjunto de lineas las cuales tienen 0, 1 o mas caracteres que finalizan
con un carácter particular que representa el fin de la linea. Los datos son interpretados
como caracteres. <los archivos binario, en cambio, son una secuencia de bytes
lmacenados según su representación interna y sin interpretar, en este caso es necesario
que sean leidos los datos tal como fueron guardados para poder ser reconocidos como
iguales.
Operaciones elementales de acceso a archivos:

Accion Efecto
Asignar(a,s) Asigna al idntificador a la cadena s que representa ub archivo
en disco
Abrir(a) Prepara el archivo asignado a la variable a para su utilizacion
Crear(a) Crea el archivo asignado al identificador a y lo prepra para su
acceso
Cerrar(a) Cierra el arhivo apuntado por a, actualiza la marca de fin si
corresponde
LeerCaracter(a,c) Lee el siguiente carácter del flujo apuntado por a y lo almacena
en c
LeerLinea(a,s) Lee la siguente linea del flujo apuntado por a y la almacena en s
GrabarCaracter(a,c) Escribe secuencialmente en el flujo a el caracter c
GrabarCadena(a,s) Escribe en el flujo a la cadena s
LeerArchivo(a,r) Lee el siguiente tipo de dato (ejemplo registro) del flujo a y lo
almacena en r
GrabarArchivo(a,r) Graba el siguiente tipo de dato, r, en el flujo a
LeerPosicion(a,p,r) Lee del flujo a el valor contenido en l posición p y lo almacena
en r
GrabarPosicion(a,p,r) Graba en la posicion p del flujo a el valor contenido en r
NumeroElementos(a) Retorna el numero de elementos almacenados en el archivo
PosicionActual(a) Retorna la posición en la que se encuentra posicionado el
puntero actual del archivo.
ApuntarA(a,p) Accede a la posición indicada por p en el archivo a.
FinArchivo(a) Retorna verdadero si se ha alcanzado la marca de fin de archivo

Definiciones de tipos
TipoArchivoEntero = TIPO Entero;
TipoRegistro = TIPO <Clave : Entero ; Nombre : Cadena>;
TipoArchivoRegistro = TIPO Archivo de TipoRegistro;

Declaracion de variables
ArchTexto : Texto //declra una varible de tipo archivo de texto
ArchEntero : TipoArchivoEntero // declara una variable de tipo archivo entero
ArchRegistro: TipoArchivoRegistro //declara una variable de tipo archivo registro

CrearArchivoEnteros(Dato_Resultado Archivo: TipoArchivoEntero): una Accion


Crea un archivo y almacena en el un conjunto de enteros, el proceso termina cuando se
ingresa un entero menor o igual a cero.
LEXICO
I : Entero;
ALGORITMO
Asignar(Archivo,”Archivo.dat”);
Crear(Archivo);
Imprimir(‘Ingrese un valor entero’);
Leer(i);
MIENTRAS (i <> 0) HACER
GrabarArchivo(Archivo,i);
Imprimir(‘Ingrese un valor entero’);
Leer(i);
FIN_MIENTRAS
Cerrar(Archivo);
FIN.

RecorrerArchivoEnteros(Dato_Resultado Archivo: TipoArchivoEntero): una Accion


Recorre un archivo existente que contiene valores enteros y los muestra por pantalla.
LEXICO
I : Entero;
ALGORITMO
Asignar(Archivo,”Archivo.dat”);
Abrir(Archivo);
MIENTRAS (No Sea FinArchivo(Archivo)) HACER
LeerArchivo(Archivo,i);
Imprimir(‘El valor almacenado es : ’,i);
FIN_MIENTRAS
Cerrar(Archivo);
FIN.

CrearArchivodeRegistros(Dato_Resultado Archivo: TipoArchivoRegistro): una


Accion
Crea un archivo y almacena en el un conjunto deregistros, el proceso termina cuando
se ingresa un entero menor o igual a cero en el campo clave del registro.
LEXICO
La lectura de cada miembro de un registro
R : TipoRegistro; cuando el dispositivo es el teclado debe hacerse
ALGORITMO por seprado. Es decir la lectura de un registro por
Asignar(Archivo,”ArchivoR.dat”); teclado se hace camo a campo
Crear(ArchivoR);
Imprimir(‘Ingrese un valor entero’);
Leer(R.clave); La escritura de un registro en un archivo (Grabar
elarchivo)puede hacersecampo a campo o por la
MIENTRAS (R.clave <> 0) HACER etructura completa. Hay lenguajes de
Imprmir(‘Ingrese un nombre’); programación omo Pascal que solo permiten esta
Leer(R.nombre); ultima opcion
GrabarArchivo(Archivo,R);
Imprmir(‘Ingrese un valor entero’);
Leer(R.Clave);
FIN_MIENTRAS
Cerrar(Archivo);
FIN.

RecorrerArchivoRegistros(Dato_Resultado Archivo: TipoArchivoRegistro): una


Accion
Recorre un archivo exsistente que contiene registros y los muestra por pantalla.
LEXICO
La lectura de un registro cuando el dispositivo es
R : TipoRegistro; un archivo se hace por estructura completa
ALGORITMO
Asignar(Archivo,”ArchivoR.dat”);
Abrir(Archivo);
MIENTRAS (No Sea FinArchivo(ArchivoR)) HACER
LeerArchivo(Archivo,R); Imprimir los dtos de un registro
Imprimir(‘La Clave es : ’,R.clave); cuando el dispositivo es la
Imprimir(‘El Nombre es : ’,R.nombre); pantalla se hace miembro a
miembro. Es decir por pantalla
FIN_MIENTRAS los registros se imprimen campo
Cerrar(Archivo); a campo
FIN.

AgregaArchivodeRegistros(Dato_Resultado Archivo: TipoArchivoRegistro): una


Accion
Agrega datos a un archivo y almacena en el un conjunto deregistros, el proceso termina
cuando se ingresa un entero menor o igual a cero en el campo clave del registro.
LEXICO El archivo existe por lo que no hay que crearlo.
R : TipoRegistro; Para agragar valores debe colocarse el punrtero
en la ultima posición por lo que hay que
ALGORITMO desplazarlo tantos registro como el valor
Asignar(Archivo,”ArchivoR.dat”); contenidoen cantidad de elementos
Abrir(ArchivoR);
ApuntarA(Archivo,CantidadElementos(Archivo))
Imprimir(‘Ingrese un valor entero’);
Leer(R.clave);
MIENTRAS (R.clave <> 0) HACER
Imprmir(‘Ingrese un nombre’);
Leer(R.nombre);
GrabarArchivo(Archivo,R);
Imprmir(‘Ingrese un valor entero’);
Leer(i);
FIN_MIENTRAS
Cerrar(Archivo);
FIN.

AgregaArchivoAlFinalDeOtro(Dato_Resultado Anterior, Actual:


TipoArchivoRegistro): una Accion
Agrega los datos del archivo actual al final del archivo anterior.
LEXICO
R : TipoRegistro; Ambos archivos existen por lo que se deben abrir
ALGORITMO y no crear, para grabar todos los registros del
actual al anterior se debe colocar el puntero del
Asignar(Anterior,”ArchivoN.dat”); anterior al final del archivo y recorriendo el
Abrir(Anterior); actual se lee y graba en anterior
Asignar(Actual,”ArchivoA.dat”);
Abrir(Actual);
ApuntarA(Anterior,CantidadElementos,Anterior)
MIENTRAS (No FinArchivo(Actual)) HACER
LeerArchivo(Actual,R);
GrabarArchivo(Anterior,R);
FIN_MIENTRAS
Cerrar(Anterior);
Cerrar(Actual);
FIN.
Acciones y funciones para pilas
Pila estructura del tipo LIFO el ultimo en entrar es el primero en salir, en general el
uso de esta estructura es adecuado cuando se persigue el propósito de invertir el orden
de una estructura dada. Su uso es reservado para los compiladores que los utilizan
para recursividad y las notaciones sufijas, por ejemplo.

CrearPila(Dato_Resultado Pila: TPNodo): una Accion


Las estructuras deben ser creadas, esto es hacer apuntar al valor NULO, o inicializar la
estructura antes de comenzar a trabajar con ellas.
ALGORITMO
Pila = NULO; Simplemente asigna el valor NULO al puntero
FIN que controla el inicio de la estructura

EsVacia(Dato Puntero: TPNodo) : Boolean una Funcion


Esta función determina si hay nodos en la pila, es una forma de verificar la existencia
de elementos en la estructura para no producir errores en tiempo de ejecución como
por ejemplo intentar sacar cuando ya no hay datos.

ALGORITMO Retona verdadero si el puntero a punta al valor


EsVaciaPila  Puntero = NULO; NULO y falso en caso contrario. La asignación d
una expresión logica asigna verdadero al
FIN identificador booleano si se cumple la condicion y
falso en caso contrario

Meter(Dato_Resultado Pila: TPNodo; Dato Valor: Tinfo) una accion


Este procedimiento inserta un nuevo nodo en la pila, se encarga de pedir memoria,
guardar la información y actualizar los punteros. En esta estructura siempre la pila
retorna el valor del primer nodo, y como se agrega adelante, el procedimiento siempre
retorna en pila el nodo que acaba de crear.
LEXICO
Pre Pila Apunta al Inicio o a NULO si esta vacía
Pos Pila apunta al primer elemento de la estructura (coincide con el creado
La estructura queda perfectamente enlazada.
Ptr : TPNodo;
ALGORITMO Pide memoria, guarda el valor en el nuevo nodo,
Nuevo(Ptr); hace que el siguiente de este nodo sea pila, es ex
primero (porque agrega delante del primero) y
Ptr^  <Valor, Pila>; pila apunta al nodo creado
Pila  Ptr
FIN.

Sacar(Dato_Resultado Pila: TPNodo; Dato_Resultado Valor: Tinfo) una accion


Este procedimiento libera el nodo apuntado por pila, se encarga de guardar la
información contenida en el primer nodo en valor, por lo que este es un parámetro
variable y actualizar los punteros.
LEXICO
PRE: Pila Apunta al Inicio y no esta vacía
POS: Libera el nodo de la cima y retorna en valor la informacion.
Pila apunta al nuevo primer elemento de la estructura o a NULO si queda
Vacia.
La estructura queda perfectamente enlazada.
Ptr : TPNodo;
ALGORITMO
Ptr  Pila; Utiliza un puntero auxiliar para conservar el
inicio de la pila, guarda el valor contenido en ese
Valor Ptr^ .info; puntero, avanza con la estructura y libera el
Pila  Pila^.sgte; puntero auxiliar.
Destruir(Ptr);
FIN

Acciones y funciones para Colas


CrearCola(Dato_Resultado ColaFte,ColaFin: TPNodo): una Accion
ALGORITMO
ColaFte = NULO;
ColaFin = NULO;
FIN

Agregar(Dato_Resultado Colafte, Colafin: TPNodo; Dato Valor: Tinfo) una accion


Este procedimiento inserta un nuevo nodo en la cola, se encarga de pedir memoria,
guardar la información y actualizar los punteros. En esta estructura siempre ColaFte
retorna el valor del primer nodo, y como se agrega después del último, el
procedimiento siempre retorna en colafin el nodo que acaba de crear.

LEXICO
PRE Colafte Apunta al Inicio o a NULO si esta vacía, Cola Fin al final o
NULO
POS ColaFte apunta al primer elemento de la estructura.
ColaFin apunta al ultimo elemento de la estructura (coincide con el
creado)
La estructura queda perfectamente enlazada.
Ptr : TPNodo;
ALGORITMO Se pide memoria se guarda la información y el
Nuevo(Ptr); siguiente del nuevo nodo siempre es el valor
Ptr^  <Valor, NULO>; NULO. Para enlazarlo, como vimos, hay dos
situaciones posibles cuando es el primer nodo, en
SI (Colafte = NULO) ese caso el puntero al inicio apunta al nuevo nodo
ENTONCES y cuando ya hay por lo menos un nodo, en ese
Colafte  Ptr caso se debe enlazar el nuevo nodo a
continuación del anterior ultimo. En todos los
SI_NO casos el puntero al ultimo siempre apuntara al
ColaFin^.sgte = Ptr; nodo creado.
FIN_SI;
ColaFin  Ptr
FIN.

Suprimir(Dato_Resultado Colafte, ColaFin: TPNodo; Dato_Resultado Valor: Tinfo)


una accion
Este procedimiento libera el nodo apuntado porcolafte, se encarga de guardar la
información contenida en el primer nodo en valor, por lo que este es un parámetro
variable y actualizar los punteros
LEXICO
PRE ColaFte Apunta al Inicio y no esta vacia
POS Libera el nodo de la cima y retorna en valor la informacion.
Colafte apunta al nuevo primer elemento de la estructura o a NULO si queda
Vacia, en ese caso, ColaFin tambien apuntara a nulo.
La estructura queda perfectamente enlazada.
Ptr : TPNodo;
ALGORITMO Utiliza un puntero auxiliar para conservar el
Ptr  Colafte; inicio de lacolaa, guarda el valor contenido en
ese puntero, avanza con la estructura y libera el
Valor Ptr^ .info; puntero auxiliar Si el puntero al inicio apunta a
ColaFte  ColaFte^.sgte; NULO (cuando saca el ultimo valor), entonces
SI (ColaFte = NULO) tambien se hace apuntar al puntero auxiliar al
valor NULO. La unica vez que el puntero al final
ENTONCES se modifica, cuando se saca, es en este ultimo
ColaFin = NULO caso.
FIN_SI;
Destruir(Ptr);
FIN

Acciones y funciones para Listas Ordenadas enlazadas


CrearLista(Dato_Resultado Lista: TPNodo): una Accion
ALGORITMO
Lista = NULO;
FIN

InsertaNodo(Dato_Resultado Lista: TPNodo; Dato Valor: Tinfo) una accion

LEXICO
PRE Lista Apunta al Inicio o a NULO si esta vacia.
POS Lista apunta al primer elemento de la estructura.
No retorna la direccion del nodo creado, salvo si es el primero
La estructura queda perfectamente enlazada y ordenada creciente.
Ptr, PtrNuevo : TPNodo;
ALGORITMO

SI (lista = NULO o Valor < Lista^.info


ENTONCES
Si la lista esta vacia, o el valor a guardar es
Nuevo(Ptr); menor que el que esta en la primera posición se
Ptr^  <Valor, Lista>; coloca delante del primero con un procedimiento
Lista  Ptr identico al de insertar en una pila.
SI_NO
Se pide memoria y se guarda la informacion

Nuevo(PtrNuevo);
PtrNuevo^  <Valor, NULO>;

Ptr = Lista;
MIENTRAS (PtrNuevo^.sgte <>NULO y Valor > PtrNuevo^.sgte^.info)
HACER
Pregunta anticipadamente por el valor contenido en el
Ptr  ptr^.sgte nodo siguiente al apuntado por ptr. Si la informacióna
FIN_MIENTRAS ingresar es mayor a la del nodo siguiente debe avanzar
una posicion
PtrNuevo`.sgte  Ptr^.sgte; Se enlazan los punteros, como se pregunta por
Ptr^.sgte  Ptrnuevo; adelantado, el siguiente del nuevo sera el que es siguiente
FIN_SI; al nodo donde salimos que es el inmediato anterior al
nueo valor. El siguiente de ese nodo sea ahora el nuevo.
El nuevo lo colocamos entre el que señalamos con ptr y el
FIN. siguiente

InsertaPrimero(Dato_Resultado Lista: TPNodo; Dato Valor: Tinfo) una accion

LEXICO
PRE Lista Apunta a NULO porque esta vacia.
POS Lista apunta al primer elemento de la estructura.

Ptr: TPNodo;
ALGORITMO
Nuevo(Ptr);
Ptr^  <Valor, NULO>;
Lista  Ptr
FIN.

InsertaDelante(Dato_Resultado Lista: TPNodo; Dato Valor: Tinfo) una accion

LEXICO
PRE Lista Apunta al Inicio y noesta vacia.
POS Lista apunta al primer elemento de la estructura.

Ptr: TPNodo;
ALGORITMO
Nuevo(Ptr);
Ptr^  <Valor, Lista>;
Lista  Ptr
FIN.

InsertaEnMedio(Dato_Resultado Lista: TPNodo; Dato Valor: Tinfo) una accion


LEXICO
PRE Lista Apunta al Inicio no esta vacia.
POS Lista apunta al primer elemento de la estructura.
No retorna la direccion,queda perfectamente enlazada y ordenada.
Ptr, PtrNuevo : TPNodo;
ALGORITMO
Nuevo(PtrNuevo);
PtrNuevo^  <Valor, NULO>;
Ptr = Lista;
MIENTRAS (PtrNuevo^.sgte <>NULO y Valor > PtrNuevo^.sgte^.info)
HACER
Ptr  ptr^.sgte
FIN_MIENTRAS
PtrNuevo`.sgte  Ptr^.sgte;
Ptr^.sgte  Ptrnuevo;
FIN.
InsertaAl Final(Dato_Resultado Lista: TPNodo; Dato Valor: Tinfo) una accion

LEXICO
PRE Lista Apunta al Inicio o a NULO si esta vacia.
POS Lista apunta al primer elemento de la estructura.
No retorna la direccion del nodo creado.
Ptr, PtrNuevo : TPNodo;
ALGORITMO
SI (lista = NULO o Valor < Lista^.info
ENTONCES
Nuevo(Ptr);
Ptr^  <Valor, Lista>;
Lista  Ptr
SI_NO
Nuevo(PtrNuevo);
PtrNuevo^  <Valor, NULO>;
Ptr = Lista;
MIENTRAS (PtrNuevo^.sgte <>NULO)
HACER
Ptr  ptr^.sgte
FIN_MIENTRAS
PtrNuevo`.sgte  Ptr^.sgte;
Ptr^.sgte  Ptrnuevo;
FIN_SI;

FIN.

InsertaNodoPorDosCampos(Dato_Resultado Lista: TPNodo; Dato Valor: Tinfo) una


accion

LEXICO
PRE Lista Apunta al Inicio o a NULO si esta vacia.
POS Lista apunta al primer elemento de la estructura.
Info es un rec¡gistro con al menos dos campos para ordenar
No retorna la direccion del nodo creado, salvo si es el primero
La estructura queda perfectamente enlazada y ordenada creciente.
Ptr, PtrNuevo : TPNodo;
ALGORITMO
SI (lista = NULO) o (Valor.C1 < Lista^.info.C1) o
(Valor.C1 =Lista^.info.C1)y(Valor.C2<Lista^.info.c2)
ENTONCES
Nuevo(Ptr);
Ptr^  <Valor, Lista>;
Lista  Ptr
SI_NO
Nuevo(PtrNuevo);
PtrNuevo^  <Valor, NULO>;
Ptr = Lista;
MIENTRAS (PtrNuevo^.sgte <>NULO) y ((Valor > PtrNuevo^.sgte^.info) o
((valor.C1 = Lista*.info.C1)y(Valor.C2 >Lista*.info.C2))
HACER
Ptr  ptr^.sgte
FIN_MIENTRAS
PtrNuevo`.sgte  Ptr^.sgte;
Ptr^.sgte  Ptrnuevo;
FIN_SI;

FIN.

BuscarNodo(Dato Lista: TPNodo; Dato Valor: Tinfo): TPNodo una funcion

LEXICO
PRE Lista Apunta al Inicio y no esta vacia.
Se busca encontrar el nodo que contenga valor como informacion
POS Lista apunta al primer elemento de la estructura.
Retorna la direccion del nodo con el valor buscado o NULO esta

Ptr : TPNodo;
ALGORITMO
Ptr = NULO;
MIENTRAS (Lista <>NULO Y Ptr = NULO) HACER
SI valor = Lista ^.info
ENTONCES
Ptr = Lista {lo encontro y sale}
SINO
Lista = Lista ^.sgte {avanza al proximo nodo}
FIN_SI
FIN_MIENTRAS
BuscarNodo = Ptr;

FIN.

BuscaOInserta(Dato_Resultado Lista,Ptr: TPNodo; Dato Valor: Tinfo) una accion

LEXICO
PRE Lista Apunta al Inicio o a NULO si esta vacia.
POS Lista apunta al primer elemento de la estructura.
Retorna la direccion del nodo creado, salvo si es el primero
La estructura queda perfectamente enlazada y ordenada creciente.
No se repite la clave
PtrNuevo : TPNodo;
ALGORITMO
SI (lista = NULO o Valor < Lista^.info
ENTONCES
Nuevo(Ptr);
Ptr^  <Valor, Lista>;
Lista  Ptr
SI_NO
Ptr = Lista;
MIENTRAS (PtrNuevo^.sgte <>NULO y Valor >= PtrNuevo^.sgte^.info)
HACER
Ptr  ptr^.sgte Similar al procedimiento inserta nodo, pero como no
debe insertar siempre se cambia el orden de las
FIN_MIENTRAS accines cuando se debe insertar en el medio. En este
SI (Ptr^.Info <> Valor) caso se busca primero y si no esta se crea el nodo y se
ENTONCES enlazan los punteros. Como ptr en este estado no
puede valer NULO y el siguiente si el ciclo de
PtrNuevo^.sgte  Ptr^.sgte; repetición se hace modificando el operador de relacion
Ptr^.sgte  Ptrnuevo; por >= en lugar de >. Al salir del ciclo si el valor
Ptr  PtrNuevo; contenido en el nodo actual es distinto al buscado
significa de ese dato no esta en la lista y se debe
FIN_SI; inserta, de lo contrario no se inserta.
FIN_SI;

FIN.

InsertaNodo2(Dato_Resultado Lista: TPNodo; Dato Valor: Tinfo) una accion

LEXICO
PRE Lista Apunta al Inicio o a NULO si esta vacia.
POS Lista apunta al primer elemento de la estructura.
No retorna la direccion del nodo creado, salvo si es el primero
La estructura queda perfectamente enlazada y ordenada creciente.
P,Q,Ptr : TPNodo;
ALGORITMO
Nuevo(Ptr);
Ptr^  <Valor, NULO>;
P  Lista;
Q  NULO;
MIENTRAS P <> NULO y Valor > p^.info HACER
Q  P;
P  P^.sgte;
FIN_MIENTRAS;

SI (P = Lista)
ENTONCES
Lista  Ptr;
SI_NO
Q^.sgte  Ptr;
FIN_SI;
Ptr^.sgte  P;
FIN.

SuprimeNodo(Dato_Resultado Lista: TPNodo; Dato Valor: Tinfo) una accion

LEXICO
PRE Lista Apunta al Inicio y no esta vacia
POS Libera el nodo si encentra el valor.
P, Q : TPNodo;
ALGORITMO
P  Lista;
Q  NULO:
MIENTRAS (P <> NULO y Valor > P^.info) HACER
Q  P;
P  P^.sgte:
FIN_MIENTRAS;
SI (P <> NULO y Valor = P^.info
ENTONCES
SI Q <> NULO
ENTONCES
Q^.sgte  P^.sgte
SI_NO
Lista  P^.sgte;
FIN_SI:
Destruir(P):
FIN_SI;
FIN

InsertaNodoListaDoblementeEnlazada(Dato_Resultado Lista: TPNodo; Dato Valor:


Tinfo) una accion
// El Nodo tiene un puntero al nodo anterior y un puntero al nodo siguiente
LEXICO
PRE Lista Apunta al Inicio o a NULO si esta vacia.
<Valor,Siguiente,Anterior>
POS Lista apunta al primer elemento de la estructura.
No retorna la direccion del nodo creado, salvo si es el primero
La estructura queda perfectamente enlazada y ordenada creciente.
Se la puede recorrer en ambas direcciones
Ptr, PtrNuevo : TPNodo;
ALGORITMO

SI (lista = NULO o Valor < Lista^.info


ENTONCES
Nuevo(Ptr);
Ptr^  <Valor, Lista,NULO>;
SI lista <> NULO
ENTONCES
Lista^.anterior Ptr
Lista  Ptr
SI_NO
Nuevo(PtrNuevo);
PtrNuevo^  <Valor, NULO,NULO>;
Ptr Lista;
MIENTRAS (Ptr^.sgte <>NULO y Valor > Ptr^.sgte^.info)
HACER
Ptr  ptr^.sgte
FIN_MIENTRAS
PtrNuevo^.sgte  Ptr^.sgte;
PtrNuevo^.ant  Ptr;
Ptr^.sgte  Ptrnuevo;
SI PtrNuevo^.sgte <> NULO
ENTONCES
PtrNuevo^.sgte.ant = PtrNuevo;
FIN_SI;

FIN_SI;

FIN.

ApareoDeListas(Dato_Resultado ListA,ListB,ListAB) una accion

LEXICO
PRE ListA y ListB Listas ordenadas simplemente enlazadas.
POS ListAB Lista enlazada producto del apareo de las listas dato.
Ptr : TPNodo; Puntero auxiliar para insertar como cola
VA,VB,VAB: TipoInfo el valor asociado a cada nodo de la lisra
ALGORITMO

ListAB = NULO;
Ptr = NULO;
MIENTRAS (ListA <> NULO) O (ListB <> NULO) HACER
SI ((ListB = NULO)O((ListA<>NULO)Y(ListA^.info<ListB^.info)))
ENTONCES
VAB = VA
SI_NO
VAB = VB
FIN_SI
Agregar(ListAB,Ptr,VAB);

FIN_MIENTRAS;
Ptr = NULO;
FIN.

ListaParalelaParaAgrupar(Dato_Resultado ListA, Dato ArchDatos,ArchProceso :


TipoArchivo) una accion

LEXICO
PRE ListA Lista Paralela al archivo de datos, con tantos nodos como registros tiene
ese archivo. Las restricciones del nodo no alcanzan para poner la clave de ordenamiento
y solo se puede poner un campo que agrupe datos del archivo de proceso.
ArchDatos es el archivo de datos personales, contiene todas las claves, esta ordenada
por esa por lo que es posible hacer búsqueda binaria. ArchProceso es el archivo a
procesar contiene la clave por la que se vincula con el archivo de datos con lo que esta
ordenado.
Se busca hacer una lista paralela para agrupar evitando busquedas secuenciales en
archivos.
POS ListA contendra el valor acumulado de cada clave del archivo de datos
relacionados posicionalmente.

ALGORITMO
ListA = NULO;
PARA I [1 .. CantidadRegistros(ArchDatos)] HACER
InsertaDelante(ListA, 0);
//Crea la lista con los contadores en cero//
FIN_PARA

MIENTRAS (HayaDatos(ArchProceso)) HACER


LeerRegistro(ArchProceso, Registro);
BusquedaBinaria(ArchDatos, Registro.Clave; Pos);
Ptr = Lista;
Para J [1 .. Pos] HACER
Ptr = Ptr*.sgte;
FIN_PARA
Incrementar(Ptr*.info, Registro.Agregado);
FIN_MIENTRAS;

FIN.

ListaParalelaParaBuscar(Dato_Resultado ListA, Dato ArchDatos,ArchProceso :


TipoArchivo) una accion

LEXICO
PRE ListA Lista Paralela al archivo de datos, con tantos nodos como registros tiene
ese archivo. Las restricciones del nodo no alcanzan para poner la posición en el
archivoclave de ordenamiento y solo se puede poner un campo que agrupe datos del
archivo de proceso.
ArchDatos es el archivo de datos personales, contiene todas las claves, No esta
ordenado lo que no es posible hacer busqueda directa ni búsqueda binaria.Se lo carga
en una lista como cola para poder buscar en la lista y luego accedre al archivo según el
numero de nodo
ArchProceso es el archivo a procesar contiene la clave por la que se vincula con el
archivo y hay que ir a buscar un valor.
Se busca hacer una lista paralela, cargada como cola para buscar evitando busquedas
secuenciales en archivos.
POS ListA contendra el la clave de busqueda y para cada clave del archivo de datos
se relacionan posicionalmente según el numero de nodo.

ALGORITMO

ListA = NULO;
Aux = NULO
PARA I [1 .. CantidadRegistros(ArchDatos)] HACER
Leer(Registro(ArchDatos, Registro)
Agregar(ListA, Aux, Registro.clave);
//Crea la lista con la clave a buscar//
FIN_PARA
Aux = NULO // Para que el resultado sea una lista y no una cola
MIENTRAS (HayaDatos(ArchProceso)) HACER
LeerRegistro(ArchProceso, Registro);
Ptr = Lista;
NumeroNodo = 0;
MIENTRAS Ptr*.info <> Registro.clave HACER
Ptr = Ptr*.sgte;
Incrementar(NumeroNodo);
FIN_MIENTRAS
AccesoDirectoArchivo(ArchDatos, NumeroNodo);
LeerRegistro(ArchDatos, RegistroDatos);
Imprimir(Registrodatos.Otra clave);
FIN_MIENTRAS;

FIN.

InsertaNodoListaCircular(Dato_Resultado Lista: TPNodo; Dato Valor: Tinfo) una


accion
//El Puntero a una lista circular apunta al predecesor al primer elemento
LEXICO
PRE Lista Apunta al al predecesor al primer elemento.
Lista no vacia, al menos un nodo
Si hay un solo nodo apunta a si mismo
POS Lista apunta al primer elemento de la estructura.
No retorna la direccion del nodo creado, salvo si es el primero
La estructura queda perfectamente enlazada y ordenada creciente.
Ptr, Auxiliar : TPNodo; Salir Booleano;
ALGORITMO

Nuevo(Auxiliar);
Aux^  <Valor, NULO>;
Lista  Ptr
SI (lista = NULO)
ENTONCES
Auxiliar^.sgte = Auxiliar;
Lista = Auxiliar;
SI_NO {La lista no esta vacia}
Ptr = Lista;
Salir = FALSO

REPETIR
SI (Ptr^.sgte^.info< Valor)
ENTONCES
Ptr  ptr^.sgte
SINO
Salir = Verdadero
FIN_SI
HASTA Salir o Ptr = Lista

Auxiliar^.sgte  Ptr^.sgte;
Ptr^.sgte  Auxiliar;
SI (Salir = FALSO)
ENTONCES
Lista = Auxiliar
FIN_SI; {de la lista no vacia}

FIN.

Acciones y funciones para arboles


RecorrerEnOrdenArbol(Dato Arbol: TPNodo; Dato Valor: Tinfo) una accion
//El Nodo tiene puntero al hijo izquierdo Y derecho
LEXICO
PRE Arbol Apunta al nodo raiz o es Nulo.
POS Recorre la estructura completa en orden.
ALGORITMO
SI (Arbol <> NULO)
ENTONCES
RecorrerEnOrdenArbol(Arbol^.izquierdo);
Imprimir(Arbol*.info);
RecorrerEnOrdenArbol(Arbol^.Derecho);
FIN_SI;

FIN.

RecorrerPreOrdenArbol(Dato Arbol: TPNodo; Dato Valor: Tinfo) una accion


//El Nodo tiene puntero al hijo izquierdo Y derecho
LEXICO
PRE Arbol Apunta al nodo raiz o es Nulo.
POS Recorre la estructura completa en pre orden.
ALGORITMO
SI (Arbol <> NULO)
ENTONCES
RecorrerPreOrdenArbol(Arbol^.izquierdo);
Imprimir(Arbol*.info);
RecorrerPreOrdenArbol(Arbol^.Derecho);
FIN_SI;

FIN.

RecorrerPosOrdenArbol(Dato Arbol: TPNodo; Dato Valor: Tinfo) una accion


//El Nodo tiene puntero al hijo izquierdo Y derecho
LEXICO
Pre Arbol Apunta al nodo raiz o es Nulo.
POS Recorre la estructura completa pos orden.
ALGORITMO
SI (Arbol <> NULO)
ENTONCES
RecorrerPosOrdenArbol(Arbol^.izquierdo);
Imprimir(Arbol*.info);
RecorrerPosOrdenArbol(Arbol^.Derecho);
FIN_SI;

FIN.
RecorrerEnOrdenInArbol(Dato Arbol: TPNodo; Dato Valor: Tinfo) una accion
//El Nodo tiene puntero al hijo izquierdo Y derecho
LEXICO
PRE Arbol Apunta al nodo raiz o es Nulo.
POS Recorre la estructura completa en orden inverso.
ALGORITMO
SI (Arbol <> NULO)
ENTONCES
RecorrerEnOrdenInArbol(Arbol^.derecho);
Imprimir(Arbol*.info);
RecorrerEnOrdenArbol(Arbol^.Izquierdo);
FIN_SI;

FIN.

RecorrerPreOrdenInArbol(Dato Arbol: TPNodo; Dato Valor: Tinfo) una accion


//El Nodo tiene puntero al hijo izquierdo Y derecho
LEXICO
PRE Arbol Apunta al nodo raiz o es Nulo.
POS Recorre la estructura completa en pre orden inverso.
ALGORITMO
SI (Arbol <> NULO)
ENTONCES
RecorrerPreOrdenInArbol(Arbol^.Derecho);
Imprimir(Arbol*.info);
RecorrerPreOrdenArbol(Arbol^.Izquierdo;
FIN_SI;

FIN.

RecorrerPosOrdenInArbol(Dato Arbol: TPNodo; Dato Valor: Tinfo) una accion


//El Nodo tiene puntero al hijo izquierdo Y derecho
LEXICO
PRE Arbol Apunta al nodo raiz o es Nulo.
POS Recorre la estructura completa pos orden inverso.
ALGORITMO
SI (Arbol <> NULO)
ENTONCES
RecorrerPosOrdenArbol(Arbol^.derecho);
Imprimir(Arbol*.info);
RecorrerPosOrdenArbol(Arbol^.izquierdo;
FIN_SI;

FIN.

RecorrerEnAnchoPrimero(Dato Arbol: TPNodo; Dato Valor: Tinfo) una accion


//El Nodo tiene puntero al hijo izquierdo Y derecho
LEXICO
PRE Arbol Apunta al nodo raiz no es Nulo.
POS Recorre la estructura completa ancho primero.
Fte, Fin: TPNodo
// Saca el nodo del árbol y lo va cargando en una cola, un nodo hay. Luego recorre hasta
que la cola quede vacía. Por cada nodo que va recorriendo, y como solo puede tener dos
hijos por ser binario, si hay nodo izquierdo lo agrega en la cola, si hay derecho también
lo agrega (esto asegura el recorrido en ancho primero). Al colocar el nodo completo del
árbol en la cola, cuando se saca se tienen los enlaces a los hijos, si es que tiene.//
ALGORITMO
Fte = NULO;
Fin = NULO;
Agregar(Fte, Fin, Arbol);
Mientras (Fte <> NULO) HACER
Suprimir(Fte, Fin, Arbol);
Imprimir(Arbol*.info);
SI (Arbol*.izq<>NULO
ENTONCES
Agregar(Fte, Fin, Arbol*.izq)
FIN_SI
SI (Arbol*.der<>NULO
ENTONCES
Agregar(Fte, Fin, Arbol*.der)
FIN_SI;

FIN_MIENTRAS;

FIN.

InsertarNodoArbol(Dato_Resultado Arbol: TPNodo; Dato Valor: Tinfo) una accion


LEXICO
PRE Arbol Apunta al nodo raiz o es Nulo.<izquierdo, info, derecho>
Las Inserciones se hacen siempre en las hojas
POS Inserta un nodo ordenado
ALGORITMO
SI (Arbol <> NULO)
ENTONCES
Nuevo(Arbol);
Arbol^ <NULO, Valor, NULO>;
SINO SI (Valor<Arbol^.info)
ENTONCES
InsertarNodoArbol(Arbol^.izquierdo, Valor)
SINO SI (Valor>Arbol^.info)
ENTONCES
InsertarNodoArbol(Arbol^.izquierdo, Valor)
SINO ERROR
FIN_SI
FIN_SI
FIN_SI;
FIN.
CantidadHojasArbol(Dato Arbol: TPNodo): Entero una funcion;
Eshoja(Dato Arbol): Booleano una funcion;
ALGORITMO
EsHoja  (Arbol^.izquierdo = NULO) Y (Arbol^.derecho = NULO;
FIN /*EsHoja
ALGORITMO
SI (Arbol <> NULO)
ENTONCES SI (EsHoja(Arbol))
ENTONCES
CantidadHojas = 1;
SINO
CanidadHojas CantidadHojas(Arbol^.izquierdo) +
CantidadHojas(Arbol^.derecho);
SINO
CantidadHojas = 0;
FIN_SI;
FIN.

AlturaArbol(Dato Arbol: TPNodo): Entero una funcion;


Maximo(Dato A, B : Entero): Entero una funcion;
ALGORITMO
SI (A > B)
ENTONCES
Maximo = A;
SINO
Maximo = B;
FIN_SI
FIN /*Maximo
ALGORITMO
SI (Arbol <> NULO)
ENTONCES
AlturaArbol 1 +
Maximo(AlturaArbol(Arbol^.izquierdo),AlturaArbol(Arbol^.derecho))

SINO
AlturaArbol -1
FIN_SI;
FIN.

BuscarEnArbol(Dato Arbol: TPNodo; Dato Valor: Tinfo): Booleano una funcion


LEXICO
PRE Arbol Apunta al nodo raiz o es Nulo.<izquierdo, info, derecho>
Busca el dato contenido en Valor
POS Retorna Verdadero si lo encuentra o falso en caso contrario.
ALGORITMO
SI (Arbol <> NULO)
ENTONCES
Si (Valor< Arbol^.info)
ENTONCES
BuscarEnArbol  BuscarEnArbol(Arbol^.izquierda, valor)
SINO SI (Valor>Arbol^.info)
ENTONCES
BuscarEnArbol  BuscarEnArbol(Arbol^.derecho, valor)
SINO
BuscarEnArbol  VERDADERO
FIN_SI
FIN_SI

SINO
BuscarEnArbol  FALSO;
FIN_SI;
FIN.

Borrar(Dato_Resultado Arbol: TPNodo; Dato Valor: Tinfo) una accion


LEXICO
PRE Arbol Apunta al nodo raiz o es Nulo.<izquierdo, info, derecho>
POS Busca el dato contenido en Valor y si lo encuentra libera el nodo
BorrarInOrder(Dato_Resultado Arbol)
ALGORITMO
SI (Arbol^.derecho<> NULO
ENTONCES
BorrarInOrder(Arbol^.derecho)
SINO
Auxiliar^.info  Arbol^.info;
Auxiliar Arbol;
Arbol  Arbol^.izquierdo;
FIN_SI
FIN

ALGORITMO
SI (Arbol <> NULO)
ENTONCES
Si (Valor< Arbol^.info)
ENTONCES
Borrar(Arbol^.izquierda, Valor)
SINO SI (Valor>Arbol^.info)
ENTONCES
Borrar(Arbol^.derecho, valor)
SINO /* en este estado lo encontro*/
Auxiliar = Arbol;
SI (Arbol^.derecha = NULO)/* No tiene hijo derecho
ENTONCES
Arbol = Arbol^.Izquierda
SINO SI(Arbol^.izquierda = NULO)
ENTONCES
Arbol = Arbol^.derecha
SINO
BorrarInOrder(Arbol^.izquierdo)
FIN_SI
FIN_SI
Liberar(Auxiliar);
FIN_SI
FIN_SI

SINO
ERROR;
FIN_SI;
FIN.

Inserciones en arboles AVL


Insercion en el sularbol izquierdo de la rama izquierda de A
Rotacion Simple Izquierda Izquierda

N1^.izquierdo  N1^.derecho (N es el nodo desbalanceado N1 su hijo izquierdo)


N1^.derecho  N1
N  N1

Insercion en el sularbol derecho de la rama izquierda de A


Rotacion Doble derecha Izquierda
N1^. izquierdo  N2^. derecho
N2^. derecho  N1
N^. derecho  N2^. izquierdo
N2^.izquierdo  N
N N2

Insercion en el sularbol derecho de la rama derecha de A


Rotacion Simple Derecha Derecha
N1^.derecho  N1^. izquierdo (N es el nodo desbalanceado N1 su hijo derecho)
N1^.izquierdo  N1
N  N1

Insercion en el sularbol izquierdo de la rama derecha de A


Rotacion Doble Izquierda derecha
N1^. derecho  N2^. izquierdo
N2^. izquierdo  N1
N^.izquierdo  N2^.derecho
N2^.derecho  N
N N2

Funciones recursivas
El flujo de control de una función recursiva requiere tres condiciones para una
terminación normal:
1. Un test para detener o continuar con la recursion.
2. Una llamada recursiva para continuar la recursion
3. Un caso base para terminar la recursion

Recursividad
SI (Es el caso base)
ENTONCES
Ejecutar la accion final
Terminr recursion
SINO
Ejecutar accion para cercar a la solucion
Invocar nuevamente a la funcion

Factorial
(Dato N : Entero): Entero una funcion;
ALGORITMO
SI (N = 0)
ENTONCES
Factorial = 1
SINO
Factorial = N * Factorial(N-1)
FINSI
FIN.

Fibonacci
(Dato N : Entero): Entero una funcion;
ALGORITMO
SI (N = 0) O (N = 1)
ENTONCES
Fibonacci = N
SINO
Fibonacci = Fibonaci(N-2)+Fibonacci(N-1)
FINSI
FIN.

EuclidesMaxCD
(Dato M,N : Entero): Entero una funcion;
ALGORITMO
SI (N <= M) Y (M Modulo N = 0)
ENTONCES
EuclidesMaxCD = N
SINO SI (M<N)
ENTONCES
EuclidesMaxCD(N,M)
SINO
EuclidesMaxCD(N, M Mod N)
FINSI
FIN.

Hanoi
(Dato Inicio, Medio, Centro : Cráter: N : Entero): NULO una funcion;
ALGORITMO
SI (N = 1)
ENTONCES
Imprimir(Mover Disco N de inicial a final)
SINO
Hanoi(Inicial, Final, Central, N- 1);
Imprimir(Mover Disco N de inicial a final)
Hanoi(Central, Final, Inicial, N- 1);
FINSI
FIN.

Recursividad indirecta

Funcion mutuamente reursiva implementdas en C

Imprimir los carcteres del alfabeto ingles


# incluye <stdio.h>
void FuncionA(char c);
void FuncionB(char c);
int main()
{
FuncionA(‘Z’);
Return 0;
}

void FuncionA(char c)
{
if( c > ‘A’ )
FuncionB(c);
Printf(“%c”,c);
}
void FuncionB(char c)
{
FuncionA(--c);
}

Determinar si un numero es par


# incluye <stdio.h>
void FuncionPar(int n);
void FuncionImpar(int n);
int main()
{
if (FuncionPr(9))
printf(“Es par”);
else
printf(“Es Impar”);
return 0;
}

int FuncionPar(int n)
{
if (n == 0)
return 1;
else
return FuncionImpar(n-1);

int FuncionImpar(int n)
{
if (n == 0)
return 0;
else
return FuncionPar(n-1);
}

Archivos en pascal
Pascal Dispone del tipo de dato text que permite vincular a una variable interna con un
archivo de texto.
En el caso de C los nombres internos se declaran como un puntero a una struct FILE, y
la discriminacion del tipo, texto o binario se realiza en la apertura
Para trabajar con archivos de texto en Pascal se debe:
1. Declarar el nombre lógico del archivo con un identificador de tipo text.
2. Relacionar el nombre interno o lógico con l externo o físico, mediante
Assign.
3. Abrirlo con Reset o Rewrite según corresponda.
En el ejemplo que sigue se desarrollan las acciones para lectura completa de un archivo
de texto. Se lee
1. Carácter a carácter.
2. Por línea completa.
3. Con formato
a. En datos simples
b. En registros

program LeerCaracteres;
{Lee un archivo de texto caracter a caracter y lo muestra por pantalla}
Arch : text;
Letra : char;
begin
Assign (Arch,'C:\....\archivo.txt');
Reset(Arch);
while not EOF(Arch) do
begin
{Lectura caracter a caracter}
read(Arch, Letra);
write(Letra);
end;
Close(Arch);
End.

program LeerPorLineas;
Arch : text;
Nombre : string;

begin
Assign (Arch,'C:\...\archivo.txt');
Reset(Arch);
while not EOF(Arch) do
begin
{Lectura por linea}
readln(Arch, nombre);
writeln(nombre);
end;
Close(Arch);
End.

program LeerConFormato;
var
Arch : text;
Entero : Integer;
Texto : string[10];
begin
Assign (Arch,'C:\...\archivo.txt');
Reset(Arch);
while not EOF(Arch) do
begin
{Lectura con formato}
readln(Arch, Entero, Texto);
writeln('Este es el entero : ', Entero:8);
writeln('Este es el texto : ', Texto:8);
end;
Close(Arch);
End.

program LeerConFormatoEnRegistro;
TipoRegistro = Record
Numero : Integer;
Cadena : string[10];
End;
var
Arch : text;
Registro : TipoRegistro;
begin
Assign (Arch,'C:\...\archivo.txt');
Reset(Arch);
while not EOF(Arch) do
begin
{Lectura con formato en regitro}
readln(Arch, Registro.Numero, Registro.Cadena);
writeln('El entero del reg.: ', Registro.Numero:8);
writeln('El texto del re. : ', Registro.Cadena:8);
end;
Close(Arch);
End.

Los archivos de tipo o de acceso directo es una colección de datos del mismo tipo con
almacenamiento sin interpretar y guardadas según su representación interna. Solo se
pueden comparar como iguales si son leídos del modo en que fueron escritos Requieren
en pascal que para poder utilizarlos se deba hacer y en orden los siguientes pasos
1. El la cláusula Type definir los tipos
a. Para el registro si corresponde, o podria evitarse se se utilizan archivo de
de tipos de datos primitivos
b. Para el archivo NombreDelTipo = FILE OF TIPO DE DATO
2. Declarar las variables en la clausula Var
a. Una para el archivo
b. Otra para el tipo de dato de cada posición.
3. Asignar y abrir los archivos
a. La asignación a traves de ASSIGN vinculando el nombre interno con el
externo.
b. La apertura según corresponda con Reset o Rewrite

Lo disponible para archivos, una vez en condiciones de ser operados es:

1. Lectura Read(Archivo, TipoDeDato) En el caso de ser un registro se lee


completo.
2. Grabar Write(NombreInterno, TipoDeDato)
3. Seek(NombreInterno,Posición), Ubica el Puntero a Pos Registros
desplazados desde el inicio del mismo
4. Flesize(NombreInterno) Indica cantidad de registros.
5. Filepos(NombreInterno) retorna la posición actual del puntero. Tambien
cantidad de registros de desoplazamiento desde el inicio del archivo.
6. Tanto filepos como filesize retonan un tipo de dato entero largo, pero pueden
ser contenido en un entero de menor jerarquia mientras no se produzca
desbordamiento del mismo.
7. EOF(NombreInterno) Retorna true si se alcanzo la marca de fin de archivo y
False en caso contrario.
8. Truncate(NombreInterno) pone la marca de fin de archivo en el lugar donde
esta el puntero. Trunca el archivo

program ConvierteTextoABinario;
Type
TipoRegistro = Record
Numero : Integer;
Cadena : string[10];
End;
TipoArchivo = FILE OF TipoRegistro;
var
Arch : text;
Registro : TipoRegistro;
Binario : TipoArchivo;
I : Integer;
begin
clrscr;
Assign (Arch,'C:\borlandc\archivo.txt');
Reset(Arch);
Assign (Binario,'C:\...\Binario.Dat');
Rewrite(Binario);
while not EOF(Arch) do
begin
{Lectura con formato en regitrode un archico de texto
y lo almacena en un archivo binario}
readln(Arch, Registro.Numero, Registro.Cadena);
write(Binario,Registro);
end;
Close(Arch);
Close(Binario);
End.

program RecorrerBinario;
uses crt;
Type
TipoRegistro = Record
Numero : Integer;
Cadena : string[10];
End;
TipoArchivo = FILE OF TipoRegistro;
var
Arch : text;
Registro : TipoRegistro;
Binario : TipoArchivo;
begin
Assign (Binario,'C:\...\Binario.Dat');
Reset(Binario);
while not EOF(Binario) do
begin
{Lectura con formato en regitro del archivo Binario}
read(Binario, Registro);
writeln('El entero del Bin.: ', Registro.Numero:8);
writeln('El texto del Bin. : ', Registro.Cadena:8);
end;
Close(Binario);
end.

program RecorreBinarioInverso;
Type
TipoRegistro = Record
Numero : Integer;
Cadena : string[10];
End;
TipoArchivo = FILE OF TipoRegistro;
Var
Binario : TipoArchivo;
Registro : TipoRegistro;
I : Integer;
Begin
Assign (Binario,'C:\...\Binario.Dat');
Reset(Binario);
For i := FileSize(Binario) - 1 downto 0 do
begin
{Lectura con formato en regitro del archivo Binario
en orden inverso}
Seek(Binario,I);
read(Binario, Registro);
writeln('El entero del Bin.: ', Registro.Numero:8);
writeln('El texto del Bin. : ', Registro.Cadena:8);
end;
Close(Arch);
Close(Binario);
end.
Ejemplo en C con aplicaciones de estructuras enlzadas
/* Toma una cadena que representa una expresión aritmética y la convierte a notación
sufijo usando procedimientos de pilas*/
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

typedef char TipoInfo;

typedef struct tiponodo {


TipoInfo Info;
struct tiponodo *sgte;
} TipoNodo;

typedef TipoNodo* TipoPuntero;

void Meter(TipoPuntero *pila , TipoInfo valor);


void Sacar(TipoPuntero *pila , TipoInfo *valor);
void Sufijo(char * cadena, char * suf);

int main()
{

char cad1[10];
clrscr();
Sufijo("5*8+3",cad1);
printf("%s\n", cad1);
getchar();
return 0;
}

void Sufijo(char * cadena, char * suf)


{
char c;
int i = 0,j=0;
TipoPuntero pila=NULL;
c = cadena[i];
while (c) {
switch(c) {
case '+':
case '-':
case '*':
case '(':
case '/': Meter(&pila, c); break;
case ')': Sacar(&pila, &c);
while (c != '(') {
suf[j++] = c;
Sacar(&pila, &c);
} break;
default : suf[j++]= c; break;
}
i++;
c=cadena[i];
}
while(pila){
Sacar(&pila,&c);
suf[j++]=c;
}
suf[j] = '\0';
}

void Meter(TipoPuntero *pila , TipoInfo valor)


{
TipoPuntero ptr;
ptr =(TipoPuntero) malloc(sizeof(TipoNodo));
ptr -> Info = valor;
ptr -> sgte = *pila;
*pila = ptr;
}

void Sacar(TipoPuntero *pila , TipoInfo *valor)


{
TipoPuntero ptr;
ptr = *pila;
*pila = (*pila)->sgte;
*valor = ptr->Info;
free(ptr);
}
ANEXO 1 Representaciones gráficas de algoritmos
Diagrama de Nassi-Sneiderman

Condición 1

T F

Acción 1 Acción 5
Acción 2 Mientras condición 3
Condición 2
Acción 6
T F
Acción 7
Acción 3
Acción 8
Acción 4 Acción 9
Acción 10
Acción 11
Acción 12

Repetir hasta condición 4

Diagramas de Jackson
Diagramas de Lindsay.

PASCAL DIAGRAMA DE DETALLE

Variable = expresión Variable ← expresión

READ (var1, var2,....var n) var1, var2,....

WRITELN var 1 var 2 var 1 var 2


(ó ó , ..... ) ó ó ,....
WRITE liter1 liter2 liter1 liter2

IF condición
THEN Condición
sentencia 1
ELSE Instrucción 1 Instrucción 2
sentencia 2

WHILE condición Condición


DO
sentencia Instrucción

REPEAT
sentencia; Instrucción 1
: :
: :
sentencia n Instrucción n
Condición
UNTIL condición

FOR variable: expres1 TO expres2


ó Instrucción
Var: exp1, exp2
DOWNTO
DO sentencia

CASE expresión
OF Expresión
const1....... const n : instrucción1
Const1... Const n Const1... Const p
:
: Instrucción1 Instrucción m
const1...... const p : instrucción m
END
Cualquier sentencia puede ser reemplazada por Correspondiendo en el diagrama de detalle
un bloque: BEGIN la secuencia:
sentencias 1; instrucción 1;
: :
: :
sentencias n instrucción n
END
Llaves de Warniel

HacerUnaCosa)
Si HacerOtraCosa

Condición Exclusión

No Vacio
Algoritmo 1
Case
Ordinal 2
HacerUnaCosa;
Mientras HacerOtraCosa;
Condición HacerAlgoMas

Notación Algoritmica
LEXICO {Léxico Global del algoritmo}
{Declaración de tipos, constantes, variables y acciones}
Acción 1
PRE {Precondición de la acción 1}
POS {Poscondición de la acción 1}
LEXICO {Léxico local, propio de la acción 1}
Declaraciones locales
ALGORITMO {Implementación de la acción 1}
{Secuencia de instrucciones de la acción 1}
FIN {Fin implementación algoritmo de la acción 1}

ALGORITMO
PRE {Precondición del algoritmo principal}
POS {Poscondición del algoritmo principal}
{Secuencia de instrucciones del algoritmo principal}
FIN {Fin del algoritmo principal}
Equivalencias entre notación algorítmica y lenguajes de programación
CONDICIONAL
Formato Pascal C
SI Condicion If expresion condicional If (expresion)
ENTONCES Then S;
S S Else
SI_NO Else R;
R R;
FIN_SI

Formato Pascal C
SEGÚN expr Case selector of switch (selector) {
V1 : S1 Valor1 : S1; case etiqueta:S; break;
V2 : S2 ......................... ..............................
EN_OTRO_CASO : Sn else Ve: Se; default: R;
FIN_SEGÚN end; }

ITERACION
Formato Pascal C
Mientras Cond. Hacer While Expresion logica do while(expresion)
S S; S;
FIN_MIENTRAS

Formato Efecto
REPETIR Repeat do
S S S;
HASTA Cond Until expresion logica while(expresion)

Formto Efecto C
PARA i [Vi..Vf] HACER For i:=Vi to vf do for(i=0;i<vf;i++)
S S; S;
FIN_PARA

Estilos de Indentación

Recomendacion de estilos de indentacion para desarrollos más claros y legibles.(Ing. J.


M. Sola)

Estilo The One True Brace Style


while( SeaVerdad() ) {
HacerUnaCosa();
HacerOtraCosa();
}
HacerUnaUltimaCosaMas();

BSD/Allman.
while( SeaVerdad() )
{
HacerUnaCosa();
HacerOtraCosa();
}
HacerUnaUltimaCosaMas();
Estilo Whitesmiths
while( SeaVerdad() )
{
HacerUnaCosa();
HacerOtraCosa();
}
HacerUnaUltimaCosaMas();

Estilo GNU
while( SeaVerdad() )
{
HacerUnaCosa();
HacerOtraCosa();
}
HacerUnaUltimaCosaMas();

Estilo Pico
while( SeaVerdad()
{ HacerUnaCosa();
HacerOtraCosa(); }
HacerUnaUltimaCosaMas();

Estilo Banner
while( SeaVerdad() ) {
HacerUnaCosa();
HacerOtraCosa();
}
HacerUnaUltimaCosaMas();
BIBLIOGRAFIA
Behrouz Forouzan. Introducción a la ciencia de la computación. 2005. Ciencias e
Ingenieria.
De Giusti. Algoritmos datos y programas. 2001. Prentice Hall.
Garcia Molina. Una introducción a la programación. 2005. Thomson.
Kernighan - Ritchie. El lenguaje de programacion C. 1988. Pearson
Kerighan – Pike. La practica de la programacion. 2000. Pearson
Perkins David. La bañera de Arquimedes y otras historias del descubrimiento
cientifico. Paidos 2004
Iranzo, j. Logica simbolica para informaticos. 2006. Alfaomega.
Perez M. Matematica discreta y algoritmos. 2005. Answer.
Joyanes Aguilar, L.Algoritmos y estructura de datos, una perspectiva en C. 2004
Mc Graw Hill

El Autor
Oscar Ricardo Bruno
Formación Academica
Licenciado en Sistemas (Instituto Tecnologico de Buenos Aires)
Magíster en Docencia Universitaria UTN FRBA
Especialista en Ingenieria en Sistemas (Maestrando) UTN FRBA
Especialista en Docencia Universitaria UTN FRBA
Profesor en Docencia Universitaria en Sistema INSPT UTN FRBA
Espeialista en Investigación Operativa ESIO DIGID

Actividad Docente
Profesor Adjunto Algoritmos y Estructura de Datos y Sintaxis y Semántica de Lengujes
UTN FRBA .
Profesor Adjunto Estructura de Datos Univeridad del Salvador
Profesor Programación II CENT 24.
Profesor Titular Laboratorio II y III Escuela Tecnica Nro 1 Otto Krause
Coordinador Area Computación EIOK
Director y jurado de tesis UTN FRBA
Ex Consejero Departamental docente UTN FRBA departamento Sistemas.

Menciones
Finalista premios Sadosky 2006 a la inteligencia argentina categoría calidad docente