INDICEESTRUCTURA DE DATOS1. Análisis de algoritmos.………………………………………………………………… 12. Manejo de Memoria………………………………………………………………...
1ESTRUCTURA DE DATOSUNIDAD 1: Análisis de AlgoritmosConcepto Complejidad AlgoritmosLa resolución práctica de un problema e...
2RequiereT(N)= t1 + t2*NSiendo t1 el tiempo que lleve ejecutar la serie “S1” de sentencias, y t2 el que lleve la serie“S2”...
3UNIDAD 2: Manejo de MemoriaMemoria EstáticaLa forma más fácil de almacenar el contenido de una variable en memoria en tie...
42. q inicializa sus variables y comienza su ejecución.Dado que las variables están permanentemente en memoria es fácil im...
5Liberación de memoria.Cuando se hace una reserva de memoria con g_malloc y, en un momento dado, el usode esa memoria no t...
6UNIDAD 3: ESTRUCTURA DATOS3.1 PILAS LIFOSon aquellas que solo tiene 2 operaciones, Push(Inserción) y Pop(Eliminación) lac...
7Corrida:PushPush es simplemente el método por el cual va agregando un Dato nuevo a la Pilatomando en cuenta la Capacidad ...
8Corrida:BúsquedaEste método usa el recorrido para encontrar Elemento y desplegar un mensaje si labúsqueda es exitosa.Deta...
9Diagrama:Corrida:EliminaciónEste método busca un Dato dentro de la pila y lo elimina.Detalle:El algoritmo compara para de...
10Apuntador1 ←- TopRepetir mientras Apuntador1 ≠ NuloSi Pila[Apuntador1] = ElementoImprimir “Eliminando el Dato…”Repeti...
11#include <stdio.h>#include <conio.h>#include <string.h>#include <iomanip.h>#include <iostream.h>class Alumno{private:int...
12return;}cout<<"Dato noencontrado..." <<endl;}void Borrar(charElem[10]){char Temp[10][10];int i=0,j=Top;if(Top==-1){cout<...
13cout<<"Dato noencontrado...ImposibleEliminar...";return;}}tec;main(){int res,op=0;while(op!=6){clrscr();cout<<"n1)Recorr...
143.2 Colas FIFOSon aquellas que solo tiene 2 operaciones, Push(Inserción) y Pop(Eliminación).Push solo se puede efectuar ...
15Diagrama:Corrida:PushPush es simplemente el método por el cual va agregando un Dato nuevo a la Colatomando en cuenta el ...
16Algoritmo:Push(Cola, Frente, Final, Max, Elemento)Si Frente = 0 y Final =9, o si Frente = (Final + 1)Imprimir "Cola Llen...
17PopPop es simplemente el método por el cual va sacando el primer Dato de la Cola (esto secomprueba ya que las Colas son ...
18Corrida:BúsquedaEste método usa el recorrido para encontrar Elemento y desplegar un mensaje si labúsqueda es exitosa.Det...
19Diagrama:Corrida:EliminaciónEste método busca un Dato dentro de la cola y lo elimina.Detalle:Este Método es la mezcla de...
20Diagrama:Corrida:
21#include <stdio.h>#include <conio.h>#include <string.h>#include <iomanip.h>#include <iostream.h>class Alumno{private:int...
22i=0;cout<<Cola[i]<<endl;}}elsecout<<"Cola Vacia...";}void Busqueda(charElem[10]){int i;if(Frente!=-1){if(Frente<=Final)f...
23encontrado..."<<endl;return;}}}elsecout<<"Dato noencontrado...";}void Borrar(charElem[10]){char Temp[10][10];int i,j;if(...
24elsecout<<"Cola Vacia...ImposibleEliminar...";}void Borrar(floatElem){int Temp[10],i,j;if(Frente!=-1){if(Frente<=Final)f...
25Busquedan3) Pushn4)Popn5) Eliminar unDaton6) Salir"<<endl;gotoxy(1,1);cout<<"Que deseashacer?: ";cin>>op;gotoxy(1,10);sw...
263.3 Listas EnlazadasRecorridoRecorrido simplemente despliega los datos almacenados en el arreglo Info, con ayuda deun se...
27Programa:#include <conio.h>#include<iostream.h>voidRecorrido(charInfo[8][2],intIndice[8],intInicio,int Disp);void main()...
28Explicación:Apuntador toma el valor de Inicio, después ve si la condición cumple para efectuar unCiclo mientras Apuntado...
29Programa:#include <conio.h>#include<iostream.h>int Busqueda(intInfo[8],intIndice[8],intInicio,intDisp,intElemento);void ...
30Inserción al PrincipioLa Inserción al Principio básicamente busca si existe algún lugar disponible en el arregloInfo y l...
31Programa:#include <conio.h>#include<iostream.h>void Recorrido(intInfo[8],intIndice[8],intInicio,int Disp);void InsPr(int...
32CORRIDA:Inserción después de Un Nodo DeterminadoLa Inserción después de un Nodo Determinado básicamente hace lo mismo qu...
33Inserción OrdenadaLa Inserción Ordenada busca la posición en donde será Insertado el Elemento y la posiciónanterior dond...
34Programa:#include <conio.h>#include<iostream.h>int InsOrd(intInfo[8],intIndice[8],intInicio,intElemento);void Recorrido(...
35CORRIDA:Eliminación por BúsquedaLa Eliminación simplemente cambia los nodos para que el dato que se desea eliminar seael...
36DiagramaPrograma:#include <conio.h>#include<iostream.h>void Recorrido(intInfo[8],intIndice[8],intInicio,int Disp);void E...
37Temp]){if(Temp==Inicio)Inicio=Indice[Inicio];elseIndice[Temp2]=Indice[Temp];Indice[Temp]=Disp;Disp=Temp;Recorrido(Info,I...
38#include <stdio.h>#include <conio.h>#include <iomanip.h>#include <iostream.h>class Alumno{private:char Nombre[10][30];in...
39return Temp;}elseTemp=Indice2[Temp];}}return -999;}//Funcion de BusquedaSobrecargada para unaCadena de Caracteresint Bus...
40{Indice2[Temp]=Indice1[Inicio];Indice2[Indice1[Inicio]]=Temp;}Indice1[Inicio]=Temp;}else{Indice1[Temp]=Indice1[Npos];if(...
41while(op!=6){clrscr();cout<<"n1) Recorridopor Inicion2)Recorrido porFinaln3) Busquedan";cout<<"4)Insercionn5) Eliminarun...
423.4 Listas Circulares:Recorrido simplemente despliega los datos almacenados en el arreglo Info, con ayuda deun segundo a...
43Programa:#include <conio.h>#include <iostream.h>void Recorrido(char Info[8][2],int Indice[8],int Inicio,int Disp);void m...
44Detalle:Apuntador toma el valor de Inicio, después ve si la condición cumple para efectuar unCiclo mientras Apuntador se...
45Programa:#include <conio.h>#include <iostream.h>int Busqueda(int Info[8],int Indice[8],int Inicio,int Disp,intElemento);...
46Corrida:Inserción al PrincipioLa Inserción al Principio básicamente busca si existe algún lugar disponible en el arreglo...
47Diagrama:Programa:#include <conio.h>#include<iostream.h>void Recorrido(intInfo[8],intIndice[8],intInicio,int Disp);void ...
48Corrida:Inserción después de un Nodo DeterminadoLa Inserción después de un Nodo Determinado básicamente hace lo mismo qu...
49el Elemento nos regresa ese valor y lo mandamos al método de la Inserción después de unNodo.Detalle:En esta ocasión usar...
50Programa:#include <stdio.h>#include <conio.h>#include<iostream.h>voidRecorrido(charInfo[8][10],intIndice[8],intInicio,in...
51Eliminación por BúsquedaLa Eliminación simplemente cambia los nodos para que el dato que se desea eliminar seael primer ...
52Programa:#include <conio.h>#include<iostream.h>void Recorrido(intInfo[8],intIndice[8],intInicio,int Disp);void EliBusq(i...
53Corrida:3.5 Listas Dobles:El Recorrido simplemente despliega los datos almacenados en el arreglo Info, conayuda de un se...
54encuentra en el arreglo Info. Esta búsqueda es más efectiva ya que compara el dato de lamitad y dependiendo el resultado...
55Diagrama:Eliminación por BúsquedaLa Eliminación simplemente cambia los nodos para que el dato que se desea eliminar seae...
56Diagrama:Corrida:
57#include <stdio.h>#include <conio.h>#include <iomanip.h>#include <iostream.h>class Alumno{private:char Nombre[10][30];in...
58Temp]<<setw(9)<<Edad[Temp]<<endl;return Temp;}elseTemp=Indice2[Temp];}}return -999;}//Funcion Sobrecargadade Busqueda de...
59{Indice2[Temp]=Indice1[Inicio];Indice2[Indice1[Inicio]]=Temp;}Indice1[Inicio]=Temp;}else{Indice1[Temp]=Indice1[Npos];if(...
60while(op!=6){clrscr();cout<<"n1) Recorridopor Inicion2)Recorrido porFinaln3) Busquedan";cout<<"4)Insercionn5)Eliminar un...
61Unidad 4: RecursividadCapacidad que tiene los métodos de invocarse a sí mismos, esta es una potenteherramienta en la inf...
62cout<<t<<"! ="<<tec.Factorial(t)<<endl;break;case 3:cout<<"f(x) = x^3+ 2x + 3"<<endl;cout<<"Escribe laBase (Menor de10)"...
63Unidad 5: Arboles5.1 Arboles Binarios:Un Árbol Binario es un conjunto de finito de Elementos, de nombre Nodos de forma q...
64Diagrama:Corrida:In-OrdenEl Recorrido “In-Orden” lo recorre de la siguiente manera, viaje a través del ÁrbolBinario desp...
65Algoritmo:PreOrd(Arbol, Der, Izq, Pila, Raiz)Temp → RaizTop →Pila[Top] → NuloSi Raiz = NuloImprmir “Arbol Vacio…” y Sali...
66Corrida:In-OrdenEl Recorrido “In-Orden” lo recorre de la siguiente manera, viaje a través del Árbol Binariodesplegando e...
67Si Arbol[Temp] = Info[Raiz]SalirTemp → Pila[Top]Top → Top - 1Fin del cicloSi Temp < 0Temp = -(Temp)Ir a EtiquetaSalirDia...
68BúsquedaLa Búsqueda es Similar a todas los Métodos anteriores de Búsqueda, simplemente efectúaun recorrido comparando el...
69Diagrama:Corrida:
70#include <conio.h>#include <iostream.h>class Arbol{private:int Top,Pila[10];intInfo[10],Izq[10],Der[10],Raiz,Disp;public...
71PosPad[1]=-999;cout<<"ElementoEncontrado..."<<endl;return;}if(Elem<Info[Raiz]){Temp=Izq[Raiz];Temp2=Raiz;}else{Temp=Der[...
72elseDer[PosPad[1]]=PosPad2[0];}elseRaiz=PosPad2[0];Izq[PosPad2[0]]=Izq[PosPad[0]];Der[PosPad2[0]]=Der[PosPad[0]];}}tec;m...
735.2 Arboles en MontonEl Árbol en Montón consiste en el ordenamiento de un conjunto de Elemento en un soloarreglo.Trabaja...
74Diagrama:Corrida:BúsquedaEl Concepto de Búsqueda es sencillo, simplemente es un método de búsqueda lineal.Existen 3 posi...
75Algoritmos:**Busqueda(Arbol, N, Elemento)**Si N ≠ 0OrdMon(Arbol, N)i ->Mientras i < N;i++)Si Arbol[i] = ElementoImprimir...
76Corrida:EliminaciónEl Concepto de Eliminación consiste en la búsqueda de un Elemento y sacarlo del Arreglo.Existen 3 cas...
77Diagrama:Corrida:Recorrido (Ordenado)El Recorrido simplemente ira desplegando cada uno de los Elementos del Árbol. Soloe...
78Algoritmo:Recorrido(Arbol, N)Si N ≠ 0i ->Mientras i < NImprimir Arbol[i]i -> i + 1//Fin del ciclo//Salir//Fin de la cond...
79#include <conio.h>#include <iostream.h>class Arbol_Monton{private:int Arbol[25];int N;public:Arbol_Monton(){for(int i=0;...
80switch (op){case 1:tec.Recorrido();break;case 2:cout<<"Que Numerodeseas buscar?"<<endl;cin>>res;tec.Busqueda(res);break;...
81Unidad 6: Ordenamientos InternosIntroducción:En esta Unidad explicaremos 4 algoritmos para el Ordenamiento de Arreglos e...
82Elem){if(N!=0){for(inti=0;i<N;i++)if(Lista[i]==Elem){Lista[i]=0;Burbuja();N--;return;}}cout<<"ListaVacia... ImposibleEli...
Estructura de datos c++
Estructura de datos c++
Estructura de datos c++
Estructura de datos c++
Estructura de datos c++
Estructura de datos c++
Estructura de datos c++
Estructura de datos c++
Estructura de datos c++
Estructura de datos c++
Estructura de datos c++
Estructura de datos c++
Estructura de datos c++
Estructura de datos c++
Estructura de datos c++
Estructura de datos c++
Estructura de datos c++
Estructura de datos c++
Estructura de datos c++
Estructura de datos c++
Estructura de datos c++
Estructura de datos c++
Estructura de datos c++
Estructura de datos c++
Estructura de datos c++
Estructura de datos c++
Estructura de datos c++
Próxima SlideShare
Cargando en…5
×

Estructura de datos c++

414 visualizaciones

Publicado el

0 comentarios
0 recomendaciones
Estadísticas
Notas
  • Sé el primero en comentar

  • Sé el primero en recomendar esto

Sin descargas
Visualizaciones
Visualizaciones totales
414
En SlideShare
0
De insertados
0
Número de insertados
2
Acciones
Compartido
0
Descargas
24
Comentarios
0
Recomendaciones
0
Insertados 0
No insertados

No hay notas en la diapositiva.

Estructura de datos c++

  1. 1. INDICEESTRUCTURA DE DATOS1. Análisis de algoritmos.………………………………………………………………… 12. Manejo de Memoria……………………………………………………………………. 33. Estructura de Datos…………………………………………………………………….. 63.1 Pilas……………………………………………………………………………………….. 63.2 Colas……………………………………………………………………………………… 143.3 Listas Enlazadas……………………………………………………………………… 263.4 Listas Circulares……………………………………………………………………… 423.5 Listas Dobles………………………………………………………………………….. 534. Recursividad………………………………………………………………………………… 615. Árboles……………………………………………………………………………………….. 635.1 Arboles Binarios……………………………………………………………………… 635.2 Árboles en Montón………………………………………………………………… 736. Ordenamientos Internos………………………………………………………………. 817. Ordenamientos Externos……………………………………………………………… 898. Búsquedas………………………………………………………………………………….. 949. GRAFOS……………………………………………………………………………………... 106
  2. 2. 1ESTRUCTURA DE DATOSUNIDAD 1: Análisis de AlgoritmosConcepto Complejidad AlgoritmosLa resolución práctica de un problema exige por una parte un algoritmo o método deresolución y por otra un programa o codificación de aquel en un ordenador real.Ambos componentes tienen su importancia, pero la del algoritmo es absolutamenteesencial, mientras que la codificación puede muchas veces pasar a nivel de anécdota.A efectos prácticos o ingenieriles, nos deben preocupar los recursos físicos necesariospara que un programa se ejecute.Aunque puede haber muchos parámetros, los más usuales son el tiempo de ejecución y lacantidad de memoria (espacio).Ocurre con frecuencia que ambos parámetros están fijados por otras razones y se planteala pregunta inversa: ¿cuál es el tamaño del mayor problema que puedo resolver en Tsegundos y/o con M bytes de memoria?En lo que sigue nos centramos casi siempre en el parámetro tiempo de ejecución, si bienlas ideas desarrolladas son fácilmente aplicables a otro tipo de recursos.Para cada problema determinaremos una medida N de su tamaño (por número de datos)e intentaremos hallar respuestas en función de dicho N.El concepto exacto que mide N depende de la naturaleza del problema.Así, para un vector se suele utilizar como N su longitud; para una matriz, el número deelementos que la componen; para un grafo, puede ser el número de nodos (a veces esmás importante considerar el número de arcos, dependiendo del tipo de problema aresolver), en un archivo se suele usar el número de registros, etc.Es imposible dar una regla general, pues cada problema tiene su propia lógica de coste.Tiempo de EjecuciónUna medida que suele ser útil conocer es el tiempo de ejecución de un programa enfunción de N, lo que denominaremos T(N).Esta función se puede medir físicamente (ejecutando el programa, reloj en mano), ocalcularse sobre el código contando instrucciones a ejecutar y multiplicando por el tiemporequerido por cada instrucción.Así, un trozo sencillo de programa como:S1; for (int i= 0; i < N; i++) S2;
  3. 3. 2RequiereT(N)= t1 + t2*NSiendo t1 el tiempo que lleve ejecutar la serie “S1” de sentencias, y t2 el que lleve la serie“S2”.Prácticamente todos los programas reales incluyen alguna sentencia condicional,haciendo que las sentencias efectivamente ejecutadas dependan de los datos concretosque se le presenten.Esto hace que más que un valor T(N) debamos hablar de un rango de valoresTmin(N) ⇐⇐⇐⇐ T(N) ⇐⇐⇐⇐ Tmax(N)Los extremos son habitualmente conocidos como “caso peor” y “caso mejor”.Entre ambos se hallara algún “caso promedio” o más frecuente.Cualquier fórmula T(N) incluye referencias al parámetro N y a una serie de constantes “Ti”que dependen de factores externos al algoritmo como pueden ser la calidad del códigogenerado por el compilador y la velocidad de ejecución de instrucciones del ordenadorque lo ejecuta.Dado que es fácil cambiar de compilador y que la potencia de los ordenadores crece a unritmo vertiginoso (en la actualidad, se duplica anualmente), intentaremos analizar losalgoritmos con algún nivel de independencia de estos factores; es decir, buscaremosestimaciones generales ampliamente válidas.
  4. 4. 3UNIDAD 2: Manejo de MemoriaMemoria EstáticaLa forma más fácil de almacenar el contenido de una variable en memoria en tiempo deejecución es en memoria estática o permanente a lo largo de toda la ejecución delprograma.No todos los objetos (variables) pueden ser almacenados estáticamente.Para que un objeto pueda ser almacenado en memoria estática su tamaño (número debytes necesarios para su almacenamiento) ha de ser conocido en tiempo de compilación,como consecuencia de esta condición no podrán almacenarse en memoria estática:• Los objetos correspondientes a procedimientos o funciones recursivas, ya que entiempo de compilación no se sabe el número de variables que serán necesarias.• Las estructuras dinámicas de datos tales como listas, árboles, etc. ya que elnúmero de elementos que las forman no es conocido hasta que el programa seejecuta.Las técnicas de asignación de memoria estática son sencillas.A partir de una posición señalada por un puntero de referencia se aloja el objeto X, y seavanza el puntero tantos bytes como sean necesarios para almacenar el objeto X.La asignación de memoria puede hacerse en tiempo de compilación y los objetos estánvigentes desde que comienza la ejecución del programa hasta que termina.En los lenguajes que permiten la existencia de subprogramas, y siempre que todos losobjetos de estos subprogramas puedan almacenarse estáticamente se aloja en la memoriaestática un registro de activación correspondiente a cada uno de los subprogramas.Estos registros de activación contendrán las variables locales, parámetros formales y valordevuelto por la función.Dentro de cada registro de activación las variables locales se organizan secuencialmente.Existe un solo registro de activación para cada procedimiento y por tanto no estánpermitidas las llamadas recursivas. El proceso que se sigue cuando un procedimiento pllama a otra q es el siguiente:1. p evalúa los parámetros de llamada, en caso de que se trate de expresionescomplejas, usando para ello una zona de memoria temporal para elalmacenamiento intermedio. Por ejemplos, sí la llamada a q esq((3*5)+(2*2),7) las operaciones previas a la llamada propiamente dicha encódigo máquina han de realizarse sobre alguna zona de memoria temporal. (Enalgún momento debe haber una zona de memoria que contenga el valorintermedio 15, y el valor intermedio 4 para sumarlos a continuación). En caso deutilización de memoria estática ésta zona de temporales puede ser común a todoel programa, ya que su tamaño puede deducirse en tiempo de compilación.
  5. 5. 42. q inicializa sus variables y comienza su ejecución.Dado que las variables están permanentemente en memoria es fácil implementar lapropiedad de que conserven o no su contenido para cada nueva llamadaMemoria Dinámica¿Qué es la memoria dinámica?Supongamos que nuestro programa debe manipular estructuras de datos de longituddesconocida. Un ejemplo simple podría ser el de un programa que lee las líneas de unarchivo y las ordena. Por tanto, deberemos leer un número indeterminado de líneas, ytras leer la última, ordenarlas. Una manera de manejar ese ``número indeterminado,sería declarar una constante MAX_LINEAS, darle un valor vergonzosamente grande, ydeclarar un array de tamaño MAX_LINEAS. Esto, obviamente, es muy ineficiente (y feo).Nuestro programa no sólo quedaría limitado por ese valor máximo, sino que ademásgastaría esa enorme cantidad de memoria para procesar hasta el más pequeño de losficheros.La solución consiste en utilizar memoria dinámica. La memoria dinámica es un espacio dealmacenamiento que se solicita en tiempo de ejecución. De esa manera, a medida que elproceso va necesitando espacio para más líneas, va solicitando más memoria al sistemaoperativo para guardarlas. El medio para manejar la memoria que otorga el sistemaoperativo, es el puntero, puesto que no podemos saber en tiempo de compilación dóndenos dará huecos el sistema operativo (en la memoria de nuestro PC).Memoria Dinámica.Sobre el tratamiento de memoria, GLib dispone de una serie de instrucciones quesustituyen a las ya conocidas por todos malloc, free, etc. y, siguiendo con el modo dellamar a las funciones en GLib, las funciones que sustituyen a las ya mencionadas song_malloc y g_free.Reserva de memoria.La función g_malloc posibilita la reserva de una zona de memoria, con un número debytes que le pasemos como parámetro. Además, también existe una función similarllamada g_malloc0 que, no sólo reserva una zona de memoria, sino que, además, llenaesa zona de memoria con ceros, lo cual nos puede beneficiar si se necesita un zona dememoria totalmente limpia.gpointer g_malloc (gulong numero_de_bytes );gpointer g_malloc0 (gulong numero_de_bytes );Existe otro conjunto de funciones que nos permiten reservar memoria de una formaparecida a cómo se hace en los lenguajes orientados a objetos.
  6. 6. 5Liberación de memoria.Cuando se hace una reserva de memoria con g_malloc y, en un momento dado, el usode esa memoria no tiene sentido, es el momento de liberar esa memoria. Y el sustituto defree es g_free que, básicamente, funciona igual que la anteriormente mencionada.void g_free (gpointer memoria_reservada );Realojamiento de memoriaEn determinadas ocasiones, sobre todo cuando se utilizan estructuras de datos dinámicas,es necesario ajustar el tamaño de una zona de memoria (ya sea para hacerla más grande omás pequeña). Para eso, GLib ofrece la función g_realloc, que recibe un puntero amemoria que apunta a una región que es la que será acomodada al nuevo tamaño ydevuelve el puntero a la nueva zona de memoria. El anterior puntero es liberado y no sedebería utilizar más:gpointer g_realloc (gpointer memoria_reservada , gulongnumero_de_bytes );Asignación dinámicaEl proceso de compactación del punto anterior es una instancia particular del problema deasignación de memoria dinámica, el cual es el cómo satisfacer una necesidad de tamaño ncon una lista de huecos libres. Existen muchas soluciones para el problema. El conjunto dehuecos es analizado para determinar cuál hueco es el más indicado para asignarse. Lasestrategias más comunes para asignar algún hueco de la tabla son:Primer ajuste: Consiste en asignar el primer hueco con capacidad suficiente. Labúsqueda puede iniciar ya sea al inicio o al final del conjunto de huecos o en dondeterminó la última búsqueda. La búsqueda termina al encontrar un hueco losuficientemente grande.Mejor ajuste: Busca asignar el espacio más pequeño de los espacios con capacidadsuficiente. La búsqueda se debe de realizar en toda la tabla, a menos que la tabla estéordenada por tamaño. Esta estrategia produce el menor desperdicio de memoria posible.Peor ajuste: Asigna el hueco más grande. Una vez más, se debe de buscar en toda latabla de huecos a menos que esté organizada por tamaño. Esta estrategia produce loshuecos de sobra más grandes, los cuales pudieran ser de más uso si llegan procesos detamaño mediano que quepan en ellos.Se ha demostrado mediante simulacros que tanto el primer y el mejor ajuste son mejoresque el peor ajuste en cuanto a minimizar tanto el tiempo del almacenamiento. Ni elprimer o el mejor ajuste es claramente el mejor en términos de uso de espacio, pero porlo general el primer ajuste es más rápido.
  7. 7. 6UNIDAD 3: ESTRUCTURA DATOS3.1 PILAS LIFOSon aquellas que solo tiene 2 operaciones, Push(Inserción) y Pop(Eliminación) lacual solo se puede efectuar por un extremo llamado Top. Sin Embargo se le pueden aplicartodas las operaciones al igual que a las listas.RecorridoYa que las pilas son LIFO(Last in - First Out) el Recorrido se hace sacando elúltimo dato que se insertó hasta que no encuentre ningún otro.Detalle:Apuntador toma el Top, después ve si la condición cumple para efectuar un Ciclo mientrasApuntador sea diferente de Nulo, si cumple lo que hace es que despliega el contenido dela Pila(Pila[Apuntador]), después Apuntador se le resta 1. Este proceso se repitehasta que Apuntador sea igual Nulo(Cuando llega a este punto la Pila yafue Recorrida).Algoritmo:Recorrido(Pila, Top)Apuntador ←- TopRepetir mientras Apuntador &ne; NuloImprimir Pila[Apuntador]Apuntador ←- Apuntador - 1Fin del cicloSalirDiagrama:
  8. 8. 7Corrida:PushPush es simplemente el método por el cual va agregando un Dato nuevo a la Pilatomando en cuenta la Capacidad Máxima (Max) de almacenar un dato.Detalle:Compara en un principio el Top con Max, si la condición no cumple es imposible insertarmás datos a la Pila, de otra forma lo que hace es Incrementar el valor de Top, y copia elvalor de Elemento en Pila[Top]. De esta forma el dato ya está insertado.Algoritmo:Push(Pila, Top, Max, Elemento)Si Top &ne; MaxTop ←- Top + 1Pila[Top] ←- ElementoSi no:Imprimir “Pila Llena”SalirDiagrama:
  9. 9. 8Corrida:BúsquedaEste método usa el recorrido para encontrar Elemento y desplegar un mensaje si labúsqueda es exitosa.Detalle:El algoritmo compara para determinar si la Pila tiene algún dato, sino simplementedesplegara Lista Vacía y saldrá. De otra manera hará un Recorrido y comparara con cadauno de los Datos de la Pila hasta encontrar el dato que desea buscar. Si lo encuentradesplegara “El Dato fue encontrado” de otra manera “El Dato no se encontró”.Algoritmo:Busqueda(Pila, Top, Elemento)Si Top &ne; NuloApuntador ←- TopRepetir mientras Apuntador &ne; NuloSi Pila[Apuntador] = ElementoImprimir “El Dato fue encontrado” y SalirApuntador ←- Apuntador - 1Fin del cicloImprimir “El Dato no se encontró”Si no:Imprimir “Pila Vacía”Salir
  10. 10. 9Diagrama:Corrida:EliminaciónEste método busca un Dato dentro de la pila y lo elimina.Detalle:El algoritmo compara para determinar si la Pila tiene algún dato, sino simplementedesplegara Pila Vacía y saldrá. De otra manera hará un Recorrido y comparara con cadauno de los Datos de la Pila hasta encontrar el dato que desea eliminar, mientras hace estocopia cada uno de los datos a un arreglo Temp para cuando encuentre el Dato regresaresos valores a la Pila. Si lo encuentra desplegara “Eliminado el Dato” y le restara 1 a Top,de otra manera “El Dato no encontrado”.Algoritmo:Borrar(Pila, Temp, Top, Elemento)Si Top &ne; Nulo
  11. 11. 10Apuntador1 ←- TopRepetir mientras Apuntador1 &ne; NuloSi Pila[Apuntador1] = ElementoImprimir “Eliminando el Dato…”Repetir mientras Apuntador2 &ne; NuloPila[Apuntador1]=Temp[Apuntador2]Fin del cicloTop ←- Top - 1 y SalirSi No:Temp[Apuntador2] ←- Pila[Apuntador1]Apuntador1 ←- Apuntador1 - 1Apuntador2 ←- Apuntador2 + 1Fin del cicloImprimir “Dato no encontrado”Si no:Imprimir “Pila Vacía”SalirDiagrama:Corrida:
  12. 12. 11#include <stdio.h>#include <conio.h>#include <string.h>#include <iomanip.h>#include <iostream.h>class Alumno{private:int Pila[10],Top,Max;char Pila1[10][10];public:Alumno(){int i,j;char Nulo[2]=" ";Max=9;Top=-1;for(i=1;i<9;i++){Pila[i]=0;strcpy(Pila1[i],Nulo);}}voidPush(charElem[10]){if(Top!=Max){Top++;strcpy(Pila1[Top],Elem);}elsecout<<"PilaLlena"<<endl;}void Push(int Elem){if(Top!=Max){Top++;Pila[Top]=Elem;}elsecout<<"PilaLlena"<<endl;}void Push(float Elem){if(Top!=Max){Top++;Pila[Top]=Elem;}elsecout<<"PilaLlena"<<endl;}void Push(double Elem){if(Top!=Max){Top++;Pila[Top]=Elem;}elsecout<<"PilaLlena"<<endl;}void Pop(void){if(Top!=-1){cout<<"Sacando elDato: "<<Pila[Top];Top--;}elsecout<<"Pila Vacia...ImposibleEliminar"<<endl;}void Recorrido(void){if(Top!=-1)int i;for(i=Top;i!=-1; i--)cout<<Pila[i] <<endl;elsecout<<"Pila Vacia...";}Void Busqueda(charElem[10]){Int i;for(i=Top;i!=-1; i--)if((strcmp(Elem,Pila1[i]))==0){cout<<"Dato"<<Pila1[i] <<"encontrado..." <<endl;return;}cout<<"Dato noencontrado..." <<endl;}Int Elem;void Busqueda(Elem){Int i;for(i=Top;i!=-1; i--)if(Elem==Pila[i]){cout<<"Dato "<<Pila[i]<<" encontrado..."<<endl;return;}cout<<"Dato noencontrado..." <<endl;}Float Elem;void Busqueda(Elem){Int i;for(i=Top;i!=-1; i--)if(Elem==Pila[i]){cout<<"Dato "<<Pila[i]<<"encontrado..."<<endl;return;}cout<<"Dato noencontrado..." <<endl;}Double Elem;void Busqueda(Elem){Int i;for(i=Top;i!=-1; i--)if(Elem==Pila[i]){cout<<"Dato "<<Pila[i]<<"encontrado..."<<endl;
  13. 13. 12return;}cout<<"Dato noencontrado..." <<endl;}void Borrar(charElem[10]){char Temp[10][10];int i=0,j=Top;if(Top==-1){cout<<"Pila Vacia...ImposibleEliminar...";return;}while(j!=-1){if((strcmp(Elem,Pila1[j]))==0){cout<<"DatoEliminado...";for(i--;i!= -1;j++,i--)strcpy(Pila1[j],Temp[i]);Top--;return;}else{strcpy(Temp[i],Pila1[j]);i++;j--;}}cout<<"Dato noencontrado...ImposibleEliminar...";return;}void Borrar(int Elem){IntTemp[10],i=0,j=Top;if(Top==-1){cout<<"Pila Vacia...ImposibleEliminar...";return;}while(j!=-1){if(Elem==Pila[j]){cout<<"DatoEliminado...";for(i--;i!= -1;j++,i--)Pila[j]=Temp[i];Top--;return;}else{Temp[i]=Pila[j];i++;j--;}}cout<<"Dato noencontrado...ImposibleEliminar...";return;}Float Elem;void Borrar(Elem){intTemp[10],i=0,j=Top;if(Top==-1){cout<<"Pila Vacia...ImposibleEliminar...";return;}while(j!=-1){if(Elem==Pila[j]){cout<<"DatoEliminado...";for(i--;i!= -1;j++,i--)Pila[j]=Temp[i];Top--;return;}else{Temp[i]=Pila[j];i++;j--;}}cout<<"Dato noencontrado...ImposibleEliminar...";return;}Double Elem;void Borrar(Elem){intTemp[10],i=0,j=Top;if(Top==-1){cout<<"Pila Vacia...ImposibleEliminar...";return;}while(j!=-1){if(Elem==Pila[j]){cout<<"DatoEliminado...";for(i--;i!= -1;j++,i--)Pila[j]=Temp[i];Top--;return;}else{Temp[i]=Pila[j];i++;j--;}}
  14. 14. 13cout<<"Dato noencontrado...ImposibleEliminar...";return;}}tec;main(){int res,op=0;while(op!=6){clrscr();cout<<"n1)Recorridon2)Busquedan3) Pushn4)Popn5) Eliminar unDaton6) Salir"<<endl;gotoxy(1,1);cout<<"Que deseashacer?: ";cin>>op;gotoxy(1,10);switch (op){case 1:tec.Recorrido();break;case 2:cout<<"Que Numerodeseas buscar?"<<endl;cin>>res;tec.Busqueda(res);break;case 3:cout<<"Que NumeroquieresInsertar?"<<endl;cin>>res;tec.Push(res);break;case 4:tec.Pop();break;case 5:cout<<"Que Numerodeseaseliminar?"<<endl;cin>>res;tec.Borrar(res);break;case 6:cout<<"Salida...";break;default:cout<<"OpcionErronea"<<endl;break;}getch();}}
  15. 15. 143.2 Colas FIFOSon aquellas que solo tiene 2 operaciones, Push(Inserción) y Pop(Eliminación).Push solo se puede efectuar por un extremo llamado Frente y Pop por el extremoLlamado Final. Sin Embargo se le pueden aplicar todas las operación al igual que a laslistas.RecorridoYa que las colas son FIFO(First in - First Out) el Recorrido se hace sacando elprimer dato que se insertó hasta que llegue al extremo llamado Final.Detalle:En un principio se compara para saber si tiene algún dato en la Cola, si no es asídesplegara “Cola Vacía…”. De otra forma compara si Frente es mayor o igual a Final, deesta forma simplemente hace un Recorrido lineal como los anteriores. De otra forma usarMax como bandera para saber cuándo empezar a contar de 0 a Final (Ya que sabemos queel Frente después del nodo Final).Algoritmo:Recorrido(Cola, Frente, Final, Max)Si Frente ≠ NuloSi Frente ≤ Final, entonces:Apuntador <-- FrenteRepetir mientras Apuntador ≤ FinalImprimir Cola[Apuntador]Apuntador <-- Apuntador + 1Fin del cicloSi no, si Frente > Final, entonces:Apuntador <-- FrenteRepetir mientras Apuntador ≠ FinalSi Apuntador > Max, entonces:Apuntador <-- 0Imprimir Cola[Apuntador]Apuntador <-- Apuntador + 1Fin del cicloSi no:Imprimir "Cola Vacía"Salir
  16. 16. 15Diagrama:Corrida:PushPush es simplemente el método por el cual va agregando un Dato nuevo a la Colatomando en cuenta el Tamaño Máximo de Capacidad (Max), el Frente y el Final de la Cola.Detalle:Primer nos aseguramos que la Cola no esté Llena, para que de esta manera sea capaz deinsertar un Elemento nuevo. Si no desplegara Cola Llena. Después compara paradeterminar las posiciones de Frente y Final y de esta manera poder moverlo con libertad.Ya que determina los valores de Frente y Final, nos Indica que Cola[Final] tomara el valorde Elemento.
  17. 17. 16Algoritmo:Push(Cola, Frente, Final, Max, Elemento)Si Frente = 0 y Final =9, o si Frente = (Final + 1)Imprimir "Cola Llena" y SalirSi Frente = NuloFrente <-- 0Final <-- 0Si no, si Final = MaxFinal <-- 0Si no:Final <-- Final + 1Cola[Final] = ElementoSalirDiagrama:Corrida:
  18. 18. 17PopPop es simplemente el método por el cual va sacando el primer Dato de la Cola (esto secomprueba ya que las Colas son FIFO), para esto toma en cuenta el Frente.Detalle:Compara para determinar si la cola está vacía, de otra forma lo que hace es Imprimir“Eliminando el Dato…”. Después se hacen una series de comparaciones para determinar lanueva posición de Frente, de esa forma el Dato que existía en Frente es Eliminado.Algoritmo:Pop(Cola, Frente, Final, Max)Si Frente ≠ NuloImprimir "Eliminado el Dato..."Si Frente = FinalFrente = NuloFinal = NuloSi no, si Frente = MaxFrente = 0Si no:Frente <-- Frente + 1Si no:Imprimir "Cola Vacía"SalirDiagrama:
  19. 19. 18Corrida:BúsquedaEste método usa el recorrido para encontrar Elemento y desplegar un mensaje si labúsqueda es exitosa.Detalle:El algoritmo usa básicamente la misma estructura del Recorrido, la única diferencia es quecompara cada uno de los Datos con Elemento, de esta forma se da cuenta si este Datoexiste en la Cola.Algoritmo:Busqueda(Cola, Frente, Fin, Max, Elemento)Si Frente ≠ NuloSi Frente ≤ Final, entonces:Apuntador <-- FrenteRepetir mientras Apuntador ≤ FinalSi Elemento = Cola[Apuntador]Imprimir "Dato encontrado..." y SalirApuntador <-- Apuntador + 1Fin del cicloSi no, si Frente > Final, entonces:Apuntador <-- FrenteRepetir mientras Apuntador ≠ FinalSi Apuntador > Max, entonces:Apuntador <-- 0Si Elemento = Cola[Apuntador]Imprimir "Dato encontrado..." y SalirApuntador <-- Apuntador + 1Fin del cicloImprimir "Dato no encontrado..."Si no:Imprimir "Cola Vacía"Salir
  20. 20. 19Diagrama:Corrida:EliminaciónEste método busca un Dato dentro de la cola y lo elimina.Detalle:Este Método es la mezcla de todos en uno, Recorrido, Búsqueda, Pop y Push. Debido quea busca el Dato haciendo un Recorrido, y en el proceso copia todos los Datos que no sonen un Arreglo Temp, para después meterlos a la Cola original, esto lo hace hasta encontrarel dato deseado que posteriormente lo Elimina.
  21. 21. 20Diagrama:Corrida:
  22. 22. 21#include <stdio.h>#include <conio.h>#include <string.h>#include <iomanip.h>#include <iostream.h>class Alumno{private:intCola[10],Frente,Final,Max;char Cola1[10][10];public:Alumno(){int i,j;char Nulo[2]=" ";Frente=-1;Final=-1;Max=9;for(i=1;i<9;i++){Cola[i]=0;strcpy(Cola1[i],Nulo);}}voidPush(charElem[10]){if((Frente==0&&Final==9)||(Frente==(Final+1))){cout<<"ColaLlena"<<endl;return;}if(Frente==-1){Frente=0;Final=0;}else if(Final==Max)Final=0;elseFinal++;strcpy(Cola1[Final],Elem);}void Push(int Elem){if((Frente==0&&Final==9)||(Frente==(Final+1))){cout<<"ColaLlena"<<endl;return;}if(Frente==-1){Frente=0;Final=0;}else if(Final==Max)Final=0;elseFinal++;Cola[Final]=Elem;}void Push(float Elem){if((Frente==0&&Final==9)||(Frente==(Final+1))){cout<<"ColaLlena"<<endl;return;}if(Frente==-1){Frente=0;Final=0;}else if(Final==Max)Final=0;elseFinal++;Cola[Final]=Elem;}void Push(double Elem){if((Frente==0&&Final==9)||(Frente==(Final+1))){cout<<"ColaLlena"<<endl;return;}if(Frente==-1){Frente=0;Final=0;}else if(Final==Max)Final=0;elseFinal++;Cola[Final]=Elem;}void Pop(void){if(Frente!=-1){cout<<"Elmininado elDato: "<<Cola[Frente];if(Frente==Final){Frente=-1;Final=-1;}else if(Frente==Max)Frente=0;elseFrente++;}elsecout<<"Cola Vacia...ImposibleEliminar"<<endl;}void Recorrido(void){int i;if(Frente!=-1){if(Frente<=Final)for(i=Frente;i<=Final;i++)cout<<Cola[i]<<endl;else if(Frente>Final)for(i=Frente;i!=Final;i++){if(i>Max)
  23. 23. 22i=0;cout<<Cola[i]<<endl;}}elsecout<<"Cola Vacia...";}void Busqueda(charElem[10]){int i;if(Frente!=-1){if(Frente<=Final)for(i=Frente;i<=Final;i++)if((strcmp(Elem,Cola1[i]))==0){cout<<"Dato"<<Cola1[i]<<"encontrado..."<<endl;return;}else if(Frente>Final)for(i=Frente;i!=Final;i++){if(i>Max)i=0;if((strcmp(Elem,Cola1[i]))==0){cout<<"Dato"<<Cola1[i]<<"encontrado..."<<endl;return;}}}elsecout<<"Dato noencontrado...";}void Busqueda(intElem){int i;if(Frente!=-1){if(Frente<=Final)for(i=Frente;i<=Final;i++)if(Elem==Cola[i]){cout<<"Dato"<<Cola[i]<<"encontrado..."<<endl;return;}else if(Frente>Final)for(i=Frente;i!=Final;i++){if(i>Max)i=0;if(Elem==Cola[i]){cout<<"Dato"<<Cola[i]<<"encontrado..."<<endl;return;}}}elsecout<<"Dato noencontrado...";}void Busqueda(floatElem){int i;if(Frente!=-1){if(Frente<=Final)for(i=Frente;i<=Final;i++)if(Elem==Cola[i]){cout<<"Dato"<<Cola[i]<<"encontrado..."<<endl;return;}else if(Frente>Final)for(i=Frente;i!=Final;i++){if(i>Max)i=0;if(Elem==Cola[i]){cout<<"Dato"<<Cola[i]<<"encontrado..."<<endl;return;}}}elsecout<<"Dato noencontrado...";}void Busqueda(doubleElem){int i;if(Frente!=-1){if(Frente<=Final)for(i=Frente;i<=Final;i++)if(Elem==Cola[i]){cout<<"Dato"<<Cola[i]<<"encontrado..."<<endl;return;}else if(Frente>Final)for(i=Frente;i!=Final;i++){if(i>Max)i=0;if(Elem==Cola[i]){cout<<"Dato"<<Cola[i]<<"
  24. 24. 23encontrado..."<<endl;return;}}}elsecout<<"Dato noencontrado...";}void Borrar(charElem[10]){char Temp[10][10];int i,j;if(Frente!=-1){if(Frente<=Final)for(j=0,i=Frente;i<=Final;i++,j++){if((strcmp(Elem,Cola1[i]))==0){cout<<"Eliminado elDato"<<Cola1[i]<<endl;if(Frente==Final){Frente=-1;Final=-1;return;}else if(Frente==Max)Frente=0;elseFrente++;for(j--,i=Frente;j!=-1;i++,j--)strcpy(Cola1[i],Temp[j]);return;}strcpy(Temp[j],Cola1[i]);}else if(Frente>Final)for(j=0,i=Frente;i!=Final;i++,j++){if(i>Max)i=0;if((strcmp(Elem,Cola1[i]))==0){cout<<"Eliminado elDato"<<Cola1[i]<<endl;if(Frente==Max)Frente=0;elseFrente++;for(j--,i=Frente;j!=-1;i++,j--){if(i>Max)i=0;strcpy(Cola1[i],Temp[j]);}return;}strcpy(Temp[j],Cola1[i]);}cout<<"Dato noEncontrado...";}elsecout<<"Cola Vacia...ImposibleEliminar...";}void Borrar(int Elem){int Temp[10],i,j;if(Frente!=-1){if(Frente<=Final)for(j=0,i=Frente;i<=Final;i++,j++){if(Elem==Cola[i]){cout<<"Eliminado elDato "<<Cola[i]<<endl;if(Frente==Final){Frente=-1;Final=-1;return;}else if(Frente==Max)Frente=0;elseFrente++;for(j--,i=Frente;j!=-1;i++,j--)Cola[i]=Temp[j];return;}Temp[j]=Cola[i];}else if(Frente>Final)for(j=0,i=Frente;i!=Final;i++,j++){if(i>Max)i=0;if(Elem==Cola[i]){cout<<"Eliminado elDato "<<Cola[i]<<endl;if(Frente==Max)Frente=0;elseFrente++;for(j--,i=Frente;j!=-1;i++,j--){if(i>Max)i=0;Cola[i]=Temp[j];}return;}Temp[j]=Cola[i];}cout<<"Dato noEncontrado...";}
  25. 25. 24elsecout<<"Cola Vacia...ImposibleEliminar...";}void Borrar(floatElem){int Temp[10],i,j;if(Frente!=-1){if(Frente<=Final)for(j=0,i=Frente;i<=Final;i++,j++){if(Elem==Cola[i]){cout<<"Eliminado elDato "<<Cola[i]<<endl;if(Frente==Final){Frente=-1;Final=-1;return;}else if(Frente==Max)Frente=0;elseFrente++;for(j--,i=Frente;j!=-1;i++,j--)Cola[i]=Temp[j];return;}Temp[j]=Cola[i];}else if(Frente>Final)for(j=0,i=Frente;i!=Final;i++,j++){if(i>Max)i=0;if(Elem==Cola[i]){cout<<"Eliminado elDato "<<Cola[i]<<endl;if(Frente==Max)Frente=0;elseFrente++;for(j--,i=Frente;j!=-1;i++,j--){if(i>Max)i=0;Cola[i]=Temp[j];}return;}Temp[j]=Cola[i];}cout<<"Dato noEncontrado...";}elsecout<<"Cola Vacia...ImposibleEliminar...";}void Borrar(doubleElem){int Temp[10],i,j;if(Frente!=-1){if(Frente<=Final)for(j=0,i=Frente;i<=Final;i++,j++){if(Elem==Cola[i]){cout<<"Eliminado elDato "<<Cola[i]<<endl;if(Frente==Final){Frente=-1;Final=-1;return;}else if(Frente==Max)Frente=0;elseFrente++;for(j--,i=Frente;j!=-1;i++,j--)Cola[i]=Temp[j];return;}Temp[j]=Cola[i];}else if(Frente>Final)for(j=0,i=Frente;i!=Final;i++,j++){if(i>Max)i=0;if(Elem==Cola[i]){cout<<"Eliminado elDato "<<Cola[i]<<endl;if(Frente==Max)Frente=0;elseFrente++;for(j--,i=Frente;j!=-1;i++,j--){if(i>Max)i=0;Cola[i]=Temp[j];}return;}Temp[j]=Cola[i];}cout<<"Dato noEncontrado...";}elsecout<<"Cola Vacia...ImposibleEliminar...";}}tec;main(){int res,op=0;while(op!=6){clrscr();cout<<"n1)Recorridon2)
  26. 26. 25Busquedan3) Pushn4)Popn5) Eliminar unDaton6) Salir"<<endl;gotoxy(1,1);cout<<"Que deseashacer?: ";cin>>op;gotoxy(1,10);switch (op){case 1:tec.Recorrido();break;case 2:cout<<"Que Numerodeseas buscar?"<<endl;cin>>res;tec.Busqueda(res);break;case 3:cout<<"Que NumeroquieresInsertar?"<<endl;cin>>res;tec.Push(res);break;case 4:tec.Pop();break;case 5:cout<<"Que Numerodeseaseliminar?"<<endl;cin>>res;tec.Borrar(res);break;case 6:cout<<"Salida...";break;default:cout<<"OpcionErronea"<<endl;break;}getch();}}
  27. 27. 263.3 Listas EnlazadasRecorridoRecorrido simplemente despliega los datos almacenados en el arreglo Info, con ayuda deun segundo arreglo llamado Índice el cual guarda el orden en el que encuentran enlazadoscada uno de los datos.Explicación:Apuntador toma el valor de Inicio, después ve si la condición cumple para efectuar unCiclo mientras Apuntador sea diferente de 0, si cumple lo que hace es que despliega laInfo[Apuntador], después Apuntador toma el valor de Indice[Apuntador] (El cualnos indica el siguiente nodo que sigue en la lista) y hace esto hasta que Apuntador seaigual a 0 (Cuando llega a este punto a llegado al fin de la Lista Enlazada).Algoritmo:Recorrido(Inicio, Info, Indice)Apuntador ←- InicioRepetir mientras Apuntador ≠ NillImprimir Info[Apuntador]Apuntador ←- Indice[Apuntador]Fin del cicloSalirDiagrama:
  28. 28. 27Programa:#include <conio.h>#include<iostream.h>voidRecorrido(charInfo[8][2],intIndice[8],intInicio,int Disp);void main(){charInfo[8][2]={{"G"},{"I"},{""},{"T"},{"O"},{"A"},{" "},{"T"}};intIndice[8]={5,7,6,1,-999,3,-999,4};intInicio=0,Disp=2;cout<<"ElRecorrido es:n";Recorrido(Info,Indice,Inicio,Disp);getch();}voidRecorrido(charInfo[8][2],intIndice[8],intInicio,int Disp){intApuntador=Inicio;while(Apuntador!=-999){cout<<Info[Apuntador];Apuntador=Indice[Apuntador];}}Corrida:BúsquedaLa Búsqueda su objetivo es encontrar un dato en el arreglo Info, si lo encuentra lodesplegara en la pantalla, si no lo encuentra no desplegara nada ya que el dato no seencuentra en el arreglo Info.
  29. 29. 28Explicación:Apuntador toma el valor de Inicio, después ve si la condición cumple para efectuar unCiclo mientras Apuntador sea diferente de 0, si cumple lo que hace a continuación es lacomparación de Elemento (El dato que vamos a buscar) con Info[Apuntador], cuandolo encuentre lo despliega y sale del método. Si no, regresa el valor de Apuntador para asísaber que no se encontró el dato.Algoritmo:Recorrido(Inicio, Info, Indice, Elemento)Apuntador ←- InicioRepetir mientras Apuntador ≠ NillSi Elemento = Info[Apuntador] entonces:Imprimir Info[Apuntador]Regresa ApuntadorApuntador ←- Indice[Apuntador]Fin del cicloRegresar ApuntadorDiagrama:
  30. 30. 29Programa:#include <conio.h>#include<iostream.h>int Busqueda(intInfo[8],intIndice[8],intInicio,intDisp,intElemento);void main(){intInfo[8]={12,10,0,9,5,3,0,20};intIndice[8]={5,7,6,1,-999,3,-999,4};intInicio=0,Disp=2,Elemento,Res;cout<<"Que Numerodeseas buscar?";cin>>Elemento;Res=Busqueda(Info,Indice,Inicio,Disp,Elemento);if(Res==-999)cout<<"Dato NoEncontrado...";getch();}int Busqueda(intInfo[8],intIndice[8],intInicio,intDisp,int Elemento){intApuntador=Inicio;while(Apuntador!=-999){if(Elemento==Info[Apuntador]){cout<<"Numero"<<Info[Apuntador]<<"encontrado...";return Apuntador;}Apuntador=Indice[Apuntador];}return Apuntador;}Corrida:
  31. 31. 30Inserción al PrincipioLa Inserción al Principio básicamente busca si existe algún lugar disponible en el arregloInfo y lo agrega como primer Nodo si es que es posible.Explicación:Hace una comparación para ver si es posible insertar otro Elemento al arreglo Info, paraesto checa si Disp es Diferente de Nulo. Si no cumple con la condición se desplegar“Sobre Carga” ya que no se puede insertar un Nuevo Elemento. Si es cierto Apuntadortoma el valor de Inicio, Disp cambia a Indice[Disp] ya que el primer Disp tomara elvalor del Nuevo Elemento, después de esto solo copia la información de Elemento alarreglo Info en la posición que guarda Apuntador, Indice[Apuntador] toma el valorde Inicio y finalmente Inicio toma el valor de Apuntador.Algoritmo:InsPr(Inicio, Disp, Info, Indice, Elemento)Si Disp ≠ Nill entonces:Apuntador ←- DispDisp ←- Indice[Disp]Info[Apuntador] ←- ElementoIndice[Apuntador] ←- InicioInicio ←- ApuntadorSi no:Imprimir “Sobre Carga”SalirDiagrama:
  32. 32. 31Programa:#include <conio.h>#include<iostream.h>void Recorrido(intInfo[8],intIndice[8],intInicio,int Disp);void InsPr(intInfo[8],intIndice[8],intInicio,intDisp,intElemento);void main(){intInfo[8]={12,10,0,9,5,3,0,20};intIndice[8]={5,7,6,1,-999,3,-999,4};intInicio=0,Disp=2,Elemento,Res;cout<<"ListaOriginaln";Recorrido(Info,Indice,Inicio,Disp);cout<<"Que Numerodeseas Insertar?";cin>>Elemento;InsPr(Info,Indice,Inicio,Disp,Elemento);getch();}void Recorrido(intInfo[8],intIndice[8],intInicio,int Disp){intApuntador=Inicio;while(Apuntador!=-999){cout<<Info[Apuntador]<<endl;Apuntador=Indice[Apuntador];}}void InsPr(intInfo[8],intIndice[8],intInicio,intDisp,int Elemento){if(Disp!=-999){intApuntador=Disp;Disp=Indice[Disp];Info[Apuntador]=Elemento;Indice[Apuntador]=Inicio;Inicio=Apuntador;Recorrido(Info,Indice,Inicio,Disp);}elsecout<<"Overflow...";}
  33. 33. 32CORRIDA:Inserción después de Un Nodo DeterminadoLa Inserción después de un Nodo Determinado básicamente hace lo mismo que lainserción al principio, la única diferencia es que este recibe la posición del nodo en la queserá Insertada. Este Algoritmo se usa para Inserción Ordenada que más adelanteexplicaremos.Explicación:Primero confirma que sea posible insertar el Dato, si no es posible solo desplegara “SobreCarga”. Si es posible insertar un dato nuevo lo posiciona en la primer posición Disponibleen el arreglo Info, después compara la Nueva Posición (Npos) que le mandamos conNill si cumple la condición el dato es insertado en la primer posición, de otra forma seposicionara en la posición que guarde Npos.Algoritmo:InsNd(Inicio, Disp, Info, Indice, Elemento, Npos)Si Disp ≠ Nill entonces:Apuntador ←- DispDisp ←- Indice[Disp]Info [Apuntador] ←- ElementoSi Npos = Nill entonces:Indice[Apuntador] ←- InicioInicio ←- ApuntadorSi no:Indice[Apuntador] ←- Indice[Npos]Indice[Npos] ←- ApuntadorSi no:Imprimir “Sobre Carga”Salir
  34. 34. 33Inserción OrdenadaLa Inserción Ordenada busca la posición en donde será Insertado el Elemento y la posiciónanterior donde será Insertado, después de encontrar la posición en la que será Insertadoel Elemento nos regresa ese valor y lo mandamos al método de la Inserción después de unNodo.Explicación:En esta ocasión usaremos dos variables para determinar la posición deseada, comparamossi Inicio es igual a Nill ó si Elemento es menor al dato que se encuentra enInfo[Inicio], si alguna de las dos cumple regresamos Nill, de esta manera Indicamosque el Elemento será el primero de todo el Arreglo Info, si no es así Temp tomara el valorde Inicio y Temp2 de la posición que le sigue a Inicio. Hace un ciclo hasta encontrar laposición en donde se insertara el Nuevo Elemento y va moviéndose de posición con lasvariables Temp y Temp2 para así determinar qué posición debe de regresar.Algoritmo:InsOrd(Inicio, Info, Indice, Elemento)Si Inicio = Nill ó Elemento < Info[Inicio] entonces:Regresar NillTemp ←- InicioTemp2 ←- Indice[Inicio]Repetir mientras Temp2 ≠ NillSi Elemento < Info[Temp2]Regresar TempTemp ←- Temp2Temp2 ←- Indice[Temp2]Regresar TempDiagrama:
  35. 35. 34Programa:#include <conio.h>#include<iostream.h>int InsOrd(intInfo[8],intIndice[8],intInicio,intElemento);void Recorrido(intInfo[8],intIndice[8],intInicio,int Disp);void InsNd(intInfo[8],intIndice[8],intInicio,int Disp,int Elemento, intNpos);void main(){intInfo[8]={12,10,0,9,5,3,0,20};intIndice[8]={5,7,6,1,-999,3,-999,4};intInicio=0,Disp=2,Elemento,Res;cout<<"ListaOriginaln";Recorrido(Info,Indice,Inicio,Disp);cout<<"Que Numerodeseas Insertar?";cin>>Elemento;Res=InsOrd(Info,Indice,Inicio,Elemento);InsNd(Info,Indice,Inicio,Disp,Elemento,Res);getch();}void Recorrido(intInfo[8],intIndice[8],intInicio,int Disp){intApuntador=Inicio;while(Apuntador!=-999){cout<<Info[Apuntador]<<endl;Apuntador=Indice[Apuntador];}}void InsNd(intInfo[8],intIndice[8],intInicio,int Disp,int Elemento, intNpos){if(Disp!=-999){intApuntador=Disp;Disp=Indice[Disp];Info[Apuntador]=Elemento;if(Npos==-999){Indice[Apuntador]=Inicio;Inicio=Apuntador;}else{Indice[Apuntador]=Indice[Npos];Indice[Npos]=Apuntador;}Recorrido(Info,Indice,Inicio,Disp);}elsecout<<"Overflow...";}int InsOrd(intInfo[8],intIndice[8],intInicio,intElemento){int Temp=-999,Temp2;if(Inicio==Temp||Elemento<Info[Inicio])return Temp;Temp=Inicio;Temp2=Indice[Inicio];while(Temp2!=-999){if(Elemento<Info[Temp2])return Temp;Temp=Temp2;Temp2=Indice[Temp2];}return Temp;}
  36. 36. 35CORRIDA:Eliminación por BúsquedaLa Eliminación simplemente cambia los nodos para que el dato que se desea eliminar seael primer disponible, de esta forma ya no estará en el Arreglo de Info.Explicación:Lo primero que hace es ver si existe algún dato en la lista para eliminar, si Inicio es igual aNill entonces solo desplegara “Imposible Eliminar”. De otra formas cambiar de Posición enPosición hasta encontrar el Elemento que sea desea Eliminar con ayudar de dos variablesque guardan la Posición actual y la anterior en donde se encuentre el dato. Ya que loencuentra cambia ese dato como la primera posición Disponible y lo apunta al siguientenodo disponible. Si no encuentra el dato simplemente desplegara “Dato no encontrado”Algoritmo:EliBusq(Inicio, Info, Indice, Elemento)Temp ←- InicioSi Temp = NillImprimir “Lista Vacia… Imposible Eliminar” y RetornarRepetir mientras Temp ≠ NillSi Elemento = Info[Temp] entonces:Si Temp = Inicio entonces:Inicio ←- Indice[Inicio]Si no:Indice[Temp2] ←- Indice[Temp]Indice[Temp] ß DispDisp ←- TempRecorrido(Inicio, Info, Indice) y RetornarSi no:Temp2 ←- TempTemp ←- Indice[Temp]Imprimir “Dato no encontrado… Imposible Eliminar” y Retornar
  37. 37. 36DiagramaPrograma:#include <conio.h>#include<iostream.h>void Recorrido(intInfo[8],intIndice[8],intInicio,int Disp);void EliBusq(intInfo[8],intIndice[8],intInicio,intDisp,intElemento);void main(){intInfo[8]={12,10,0,9,5,3,0,20};intIndice[8]={5,7,6,1,-999,3,-999,4};intInicio=0,Disp=2,Elemento,Res;cout<<"ListaOriginaln";Recorrido(Info,Indice,Inicio,Disp);cout<<"Que Numerodeseas Eliminar?";cin>>Elemento;EliBusq(Info,Indice,Inicio,Disp,Elemento);getch();}void Recorrido(intInfo[8],intIndice[8],intInicio,int Disp){intApuntador=Inicio;while(Apuntador!=-999){cout<<Info[Apuntador]<<endl;Apuntador=Indice[Apuntador];}}void EliBusq(intInfo[8],intIndice[8],intInicio,intDisp,int Elemento){intTemp=Inicio,Temp2;if(Temp==-999){cout<<"ListaVacia... ImposibleEliminar";return;}while(Temp!=-999){if(Elemento==Info[
  38. 38. 37Temp]){if(Temp==Inicio)Inicio=Indice[Inicio];elseIndice[Temp2]=Indice[Temp];Indice[Temp]=Disp;Disp=Temp;Recorrido(Info,Indice,Inicio,Disp);return;}else{Temp2=Temp;Temp=Indice[Temp];}}cout<<"Dato noencontrado...ImposibleEliminar";return;}CORRIDA:
  39. 39. 38#include <stdio.h>#include <conio.h>#include <iomanip.h>#include <iostream.h>class Alumno{private:char Nombre[10][30];intN_control[10],Edad[10],Indice1[10],Indice2[10],Inicio,Fin,Disp;public://ConstructorAlumno(){int i,j;Inicio=0;Fin=0;Disp=1;Indice1[Inicio]=-999;Indice2[Fin]=-999;for(i=1;j=2;i<9;i++;j++)Indice1[i]=j;Indice1[9]=-999;}//Funcion de Recorridovoid Recorrido(int op){int i=0,Temp;if(op==1){Temp=Indice1[Inicio];if(Temp!=-999){cout<<"Numero deControl"<<setw(19)<<"Nombre delAlumno"<<setw(5)<<"Edad"<<endl;while(Temp!=-999){if(i==(int(Edad[Inicio]/2))){N_control[Inicio]=Ncontrol[i];strcpy(Nombre[Inicio],Nombre[i]);}cout<<setw(9)<<N_control[Temp]<<setw(22)<<Nombre[Temp]<<setw(9)<<Edad[Temp]<<endl;Temp=Indice1[Temp];i++;}}elsecout<<"ListaVacia...";}if(op==2){Temp=Fin;if(Edad[Inicio]!=0){cout<<"Numero deControl"<<setw(19)<<"Nombre delAlumno"<<setw(5)<<"Edad"<<endl;while(Temp!=-999&&i<Edad[Inicio]){if(i==(int(Edad[Inicio]/2))){N_control[Inicio]=N_control[i];strcpy(Nombre[Inicio],Nombre[i]);}cout<<setw(9)<<N_control[Temp]<<setw(22)<<Nombre[Temp]<<setw(9)<<Edad[Temp]<<endl;Temp=Indice2[Temp];i++;}}elsecout<<"ListaVacia...";}}//Funcion de BusquedaSobrecargada para unDato Enteroint Busqueda(int Elem){if(Elem<N_control[Inicio]){intTemp=Indice1[Inicio];while(Temp!=-999){if(Elem==N_control[Temp]){gotoxy(1,10);cout<<"Numero deControl"<<setw(19)<<"Nombre delAlumno"<<setw(5)<<"Edad"<<endl;cout<<setw(9)<<N_control[Temp]<<setw(22)<<Nombre[Temp]<<setw(9)<<Edad[Temp]<<endl;return Temp;}elseTemp=Indice1[Temp];}}else{int Temp=Fin;while(Temp!=-999){if(Elem==N_control[Temp]){gotoxy(1,10);cout<<"Numero deControl"<<setw(19)<<"Nombre delAlumno"<<setw(5)<<"Edad"<<endl;cout<<setw(9)<<N_control[Temp]<<setw(22)<<Nombre[Temp]<<setw(9)<<Edad[Temp]<<endl;
  40. 40. 39return Temp;}elseTemp=Indice2[Temp];}}return -999;}//Funcion de BusquedaSobrecargada para unaCadena de Caracteresint Busqueda(charElem[30]){if((strcmp(Elem,Nombre[Inicio]))<0){intTemp=Indice1[Inicio];while(Temp!=-999){if((strcmp(Elem,Nombre[Temp]))==0){gotoxy(1,10);cout<<"Numero deControl"<<setw(19)<<"Nombre delAlumno"<<setw(5)<<"Edad"<<endl;cout<<setw(9)<<N_control[Temp]<<setw(22)<<Nombre[Temp]<<setw(9)<<Edad[Temp]<<endl;return Temp;}elseTemp=Indice1[Temp];}}else{int Temp=Fin;while(Temp!=-999){if((strcmp(Elem,Nombre[Temp]))==0){gotoxy(1,10);cout<<"Numero deControl"<<setw(19)<<"Nombre delAlumno"<<setw(5)<<"Edad"<<endl;cout<<setw(9)<<N_control[Temp]<<setw(22)<<Nombre[Temp]<<setw(9)<<Edad[Temp]<<endl;return Temp;}elseTemp=Indice2[Temp];}}return -999;}//Funcion Sobrecargadade Orden para un DatoEnteroint Enca(int E_nc){intTemp=Indice1[Inicio],Temp2;if(Temp==-999||E_nc<N_control[Temp])return -999;Temp2=Indice1[Indice1[Inicio]];while(Temp2!=-999){if(E_nc<N_control[Temp2])return Temp;Temp=Temp2;Temp2=Indice1[Temp2];}return Temp;}//Funcion Sobrecargadade Orden para unaCadena de Caracteresint Enca(charE_nom[30]){intTemp=Indice1[Inicio],Temp2;if(Temp==-999)return -999;if((strcmp(E_nom,Nombr[Temp]))<0)return Temp;Temp2=Indice1[Indice1[Inicio]];while(Temp2!=-999){if((strcmp(E_nom,Nombre[Temp2]))<0)return Temp;Temp=Temp2;Temp2=Indice1[Temp2];}return Temp;}//Funcion para laInsercion en un LugarDeterminadovoid InsLug(charE_nom[30],int E_nc,intE_edad,int Npos){if(Disp!=-999){Edad[Inicio]++;int Temp=Disp;Disp=Indice1[Disp];strcpy(Nombre[Temp],E_nom);N_control[Temp]=E_nc;Edad[Temp]=E_edad;if(Npos==-999){Indice1[Temp]=Indice1[Inicio];if(Indice2[Fin]==-999){Indice2[Temp]=Fin;Fin=Temp;}else
  41. 41. 40{Indice2[Temp]=Indice1[Inicio];Indice2[Indice1[Inicio]]=Temp;}Indice1[Inicio]=Temp;}else{Indice1[Temp]=Indice1[Npos];if(Fin==Npos){Indice2[Temp]=Fin;Fin=Temp;}else{Indice2[Temp]=Npos;Indice2[Indice1[Npos]]=Temp;}Indice1[Npos]=Temp;}}elsecout<<"Overflow..."<<endl;}//Funcion Sobrecargadapara Borrar un DatoEnterovoid Borrar(int Elem){intTemp2,Temp=Indice1[Inicio];if(Temp==-999){cout<<"Lista Vacia...Imposible Eliminar";return;}while(Temp!=-999){if(Elem==N_control[Temp]){Edad[Inicio]--;if(Temp==Indice1[Inicio]){Indice1[Inicio]=Indice1[Indice1[Inicio]];Indice2[Indice1[Inicio]]=Inicio;}else if(Temp==Fin){Indice1[Temp2]=Indice1[Temp];Fin=Indice2[Fin];}else{Indice1[Temp2]=Indice1[Temp];Indice2[Indice1[Temp2]]=Temp2;}Indice1[Temp]=Disp;Disp=Temp;return;}else{Temp2=Temp;Temp=Indice1[Temp];}}cout<<"Dato noencontrado...Imposible Eliminar";return;}//Funcion Sobrecargadapara Borrar una Cadenade Caracteresvoid Borrar(charElem[30]){intTemp2,Temp=Indice1[Inicio];if(Temp==Inicio){cout<<"Lista Vacia...Imposible Eliminar";return;}while(Temp!=Inicio){if((strcmp(Elem,Nombre[Temp]))==0){Edad[Inicio]--;if(Temp==Indice1[Inicio]){Indice1[Inicio]=Indice1[Indice1[Inicio]];Indice2[Indice1[Inicio]]=Inicio;}else if(Temp==Fin){Indice1[Temp2]=Indice1[Temp];Fin=Indice2[Fin];}else{Indice1[Temp2]=Indice1[Temp];Indice2[Indice1[Temp2]]=Temp2;}Indice1[Temp]=Disp;Disp=Temp;return;}else{Temp2=Temp;Temp=Indice1[Temp];}}cout<<"Dato noencontrado...Imposible Eliminar";return;}}tec;main(){int op=0,res;char inom[30];int in_c,iedad;
  42. 42. 41while(op!=6){clrscr();cout<<"n1) Recorridopor Inicion2)Recorrido porFinaln3) Busquedan";cout<<"4)Insercionn5) Eliminarun Daton6)Salir"<<endl;gotoxy(1,1);cout<<"Que deseashacer: ";cin>>op;gotoxy(1,10);switch (op){case 1:tec.Recorrido(1);break;case 2:tec.Recorrido(2);break;case 3:cout<<"Que Numero deControl deseasbuscar?"<<endl;cin>>res;res=tec.Busqueda(res);if(res==-999)cout<<"Dato noencontrado";break;case 4:cout<<"Que nombrequieresInsertar?"<<endl;gets(inom);cout<<"Cual es suNumero deControl?"<<endl;cin>>in_c;cout<<"Cual es suEdad?"<<endl;cin>>iedad;res=tec.Enca(in_c);tec.InsLug(inom,in_c,iedad,res);break;case 5:cout<<"Que Numero deControl deseaseliminar?"<<endl;cin>>res;tec.Borrar(res);break;case 6:cout<<"Salida...";break;default:cout<<"OpcionErronea"<<endl;break;}getch();}}
  43. 43. 423.4 Listas Circulares:Recorrido simplemente despliega los datos almacenados en el arreglo Info, con ayuda deun segundo arreglo llamado Índice el cual guarda el orden en el que encuentran enlazadoscada uno de los datos.Detalle:Apuntador toma el valor de Indice[Inicio], después ve si la condición cumple paraefectuar un Ciclo mientras Apuntador sea diferente de Inicio, si cumple lo que hace es quedespliega la Info[Apuntador], después Apuntador toma el valor deIndice[Apuntador] (El cual nos indica el siguiente nodo que sigue en la lista) y haceesto hasta que Apuntador sea igual a Inicio (Cuando llega a este punto a llegado al fin de laLista).Algoritmo:Recorrido(Inicio, Info, Indice)Apuntador → Indice[Inicio]Repetir mientras Apuntador ≠ InicioImprimir Info[Apuntador]Apuntador → Indice[Apuntador]Fin del cicloSalirDiagrama:
  44. 44. 43Programa:#include <conio.h>#include <iostream.h>void Recorrido(char Info[8][2],int Indice[8],int Inicio,int Disp);void main(){char Info[8][2]={{" "},{"I"},{" "},{"T"},{"O"},{"A"},{"G"},{"T"}};int Indice[8]={6,7,-999,1,0,3,5,4};int Inicio=0,Disp=2;cout<<"El Recorrido es:n";Recorrido(Info,Indice,Inicio,Disp);getch();}void Recorrido(char Info[8][2],int Indice[8],int Inicio,int Disp){int Apuntador=Indice[Inicio];while(Apuntador!=Inicio){cout<<Info[Apuntador];Apuntador=Indice[Apuntador];}}Corrida:BúsquedaLa Búsqueda su objetivo es encontrar un dato en el arreglo Info, si lo encuentra lodesplegara en la pantalla, si no lo encuentra no desplegara nada ya que el dato no seencuentra en el arreglo Info.
  45. 45. 44Detalle:Apuntador toma el valor de Inicio, después ve si la condición cumple para efectuar unCiclo mientras Apuntador sea diferente de 0, si cumple lo que hace a continuación es lacomparación de Elemento (El dato que vamos a buscar) con Info[Apuntador], cuandolo encuentre lo despliega y sale del método. Si no, regresa el valor de Apuntador para asísaber que no se encontró el dato.Algoritmo:Recorrido(Inicio, Info, Indice, Elemento)Apuntador → Indice[Inicio]Repetir mientras Apuntador ≠ InicioSi Elemento = Info[Apuntador] entonces:Imprimir Info[Apuntador]Regresa ApuntadorApuntador → Indice[Apuntador]Fin del cicloRegresar ApuntadorDiagrama:
  46. 46. 45Programa:#include <conio.h>#include <iostream.h>int Busqueda(int Info[8],int Indice[8],int Inicio,int Disp,intElemento);void main(){int Info[8]={0,10,0,9,5,3,0,20};int Indice[8]={5,7,6,1,0,3,-999,4};int Inicio=0,Disp=2,Elemento,Res;cout<<"Que Numero deseas buscar?";cin>>Elemento;Res=Busqueda(Info,Indice,Inicio,Disp,Elemento);if(Res==-999)cout<<"Dato No Encontrado...";getch();}int Busqueda(int Info[8],int Indice[8],int Inicio,int Disp,intElemento){int Apuntador=Indice[Inicio];while(Apuntador!=Inicio){if(Elemento==Info[Apuntador]){cout<<"Numero "<<Info[Apuntador]<<" encontrado...";return Apuntador;}Apuntador=Indice[Apuntador];}return Apuntador;}
  47. 47. 46Corrida:Inserción al PrincipioLa Inserción al Principio básicamente busca si existe algún lugar disponible en el arregloInfo y lo agrega como primer Nodo si es que es posible.Detalle:Hace una comparación para ver si es posible insertar otro Elemento al arreglo Info, paraesto checa si Disp es Diferente de Nulo. Si no cumple con la condición se desplegar “SobreCarga” ya que no se puede insertar un Nuevo Elemento. Si es cierto Apuntador toma elvalor de Inicio, Disp cambia a Indice[Disp] ya que el primer Disp tomara el valor delNuevo Elemento, después de esto solo copia la información de Elemento al arreglo Info enla posición que guarda Apuntador, Indice[Apuntador] toma el valor deIndice[Inicio] y finalmente Indice[Inicio] toma el valor de Apuntador.Algoritmo:InsPr(Inicio, Disp, Info, Indice, Elemento)Si Disp ≠ Nill entonces:Apuntador → DispDisp → Indice[Disp]Info[Apuntador] → ElementoIndice[Apuntador] → Indice[Inicio]Indice[Inicio] → ApuntadorSi no:Imprimir “Sobre Carga”Salir
  48. 48. 47Diagrama:Programa:#include <conio.h>#include<iostream.h>void Recorrido(intInfo[8],intIndice[8],intInicio,int Disp);void InsPr(intInfo[8],intIndice[8],intInicio,intDisp,intElemento);void main(){intInfo[8]={0,10,0,9,5,3,0,20};intIndice[8]={5,7,6,1,0,3,-999,4};intInicio=0,Disp=2,Elemento,Res;cout<<"ListaOriginaln";Recorrido(Info,Indice,Inicio,Disp);cout<<"Que Numerodeseas Insertar?";cin>>Elemento;InsPr(Info,Indice,Inicio,Disp,Elemento);getch();}void Recorrido(intInfo[8],intIndice[8],intInicio,int Disp){intApuntador=Indice[Inicio];while(Apuntador!=Inicio){cout<<Info[Apuntador]<<endl;Apuntador=Indice[Apuntador];}}void InsPr(intInfo[8],intIndice[8],intInicio,intDisp,int Elemento){if(Disp!=-999){intApuntador=Disp;Disp=Indice[Disp];Info[Apuntador]=Elemento;Indice[Apuntador]=Indice[Inicio];Indice[Inicio]=Apuntador;Recorrido(Info,Indice,Inicio,Disp);}elsecout<<"Overflow...";}
  49. 49. 48Corrida:Inserción después de un Nodo DeterminadoLa Inserción después de un Nodo Determinado básicamente hace lo mismo que lainserción al principio, la única diferencia es que este recibe la posición del nodo en la queserá Insertada. Este Algoritmo se usa para Inserción Ordenada que más adelanteexplicaremos.Detalle:Primero confirma que sea posible insertar el Dato, si no es posible solo desplegara “SobreCarga”. Si es posible insertar un dato nuevo lo posiciona en la primer posición Disponibleen el arreglo Info, después compara la Nueva Posición (Npos) que le mandamos conNill si cumple la condición el dato es insertado en la primer posición, de otra forma seposicionara en la posición que guarde Npos.Algoritmo:InsOrd(Inicio, Disp, Info, Indice, Elemento, Npos)Si Disp ≠ Nill entonces:Apuntador → DispDisp → Indice[Disp]Info [Apuntador] → ElementoSi Npos = Nill entonces:Indice[Apuntador] → Indice[Inicio]Indice[Inicio] → ApuntadorSi no:Indice[Apuntador] → Indice[Npos]Indice[Npos] → ApuntadorSi no:Imprimir “Sobre Carga”SalirInserción OrdenadaLa Inserción Ordenada busca la posición en donde será Insertado el Elemento y la posiciónanterior donde será Insertado, después de encontrar la posición en la que será Insertado
  50. 50. 49el Elemento nos regresa ese valor y lo mandamos al método de la Inserción después de unNodo.Detalle:En esta ocasión usaremos dos variables para determinar la posición deseada, comparamossi Indice[Inicio] es igual a Inicio ó si Elemento es menor al dato que se encuentra enInfo[Inicio], si alguna de las dos cumple regresamos Nill, de esta manera Indicamosque el Elemento será el primero de todo el Arreglo Info, si no es así Temp tomara el valorde Inicio y Temp2 de la posición que le sigue a Inicio. Hace un ciclo hasta encontrar laposición en donde se insertara el Nuevo Elemento y va moviéndose de posición con lasvariables Temp y Temp2 para así determinar que posición debe de regresar.Algoritmo:InsOrd(Inicio, Info, Indice, Elemento)Si Inicio = Indice[Inicio] ó Elemento < Info[Inicio] entonces:Regresar NillTemp → Indice[Inicio]Temp2 → Indice[Temp]Repetir mientras Temp2 ≠ InicioSi Elemento < Info[Temp2]Regresar TempTemp → Temp2Temp2 → Indice[Temp2]Regresar TempDiagrama:
  51. 51. 50Programa:#include <stdio.h>#include <conio.h>#include<iostream.h>voidRecorrido(charInfo[8][10],intIndice[8],intInicio,int Disp);void InsPr(charInfo[8][10],intIndice[8],intInicio,intDisp,charElemento[10]);void InsOrd(charInfo[8][10],intIndice[8],intInicio,intDisp,charElemento[10]);void main(){charInfo[8][10]={{"Cabeza"},{"e"},{""},{"c"},{"i"},{"a"},{" "},{"g"}};char Elemento[10];intIndice[8]={5,7,6,1,0,3,-999,4};intInicio=0,Disp=2,Res;cout<<"ListaOriginaln";Recorrido(Info,Indice,Inicio,Disp);cout<<"Que Numerodeseas Insertar?";gets(Elemento);InsOrd(Info,Indice,Inicio,Disp,Elemento);getch();}voidRecorrido(charInfo[8][10],intIndice[8],intInicio,int Disp){intApuntador=Indice[Inicio];while(Apuntador!=Inicio){cout<<Info[Apuntador]<<endl;Apuntador=Indice[Apuntador];}}void InsPr(charInfo[8][10],intIndice[8],intInicio,intDisp,charElemento[10]){if(Disp!=-999){strcpy(Info[Disp],Elemento);Indice[Disp]=Indice[Inicio];Indice[Inicio]=Disp;Disp=Indice[Disp];}Recorrido(Info,Indice,Inicio,Disp);}void InsOrd(charInfo[8][10],intIndice[8],intInicio,intDisp,charElemento[10]){if(Inicio==Indice[Inicio]||(strcmp(Elemento,Info[Indice[Inicio]]))==0){InsPr(Info,Indice,Inicio,Disp,Elemento);return;}intTemp=Indice[Inicio],Temp2=Indice[Temp];while(Temp2!=Inicio){if((strcmp(Elemento,Info[Temp2]))<0)break;Temp=Temp2;Temp2=Indice[Temp2];}strcpy(Info[Disp],Elemento);Indice[Disp]=Indice[Temp];Indice[Temp]=Disp;Disp=Indice[Disp];Recorrido(Info,Indice,Inicio,Disp);}
  52. 52. 51Eliminación por BúsquedaLa Eliminación simplemente cambia los nodos para que el dato que se desea eliminar seael primer disponible, de esta forma ya no estará en el Arreglo de Info.Detalle:Lo primero que hace es ver si existe algún dato en la lista para eliminar, siIndice[Inicio] es igual a Inicio entonces solo desplegara “Imposible Eliminar”. De otraformas cambiar de Posición en Posición hasta encontrar el Elemento que sea deseaEliminar con ayudar de dos variables que guardan la Posición actual y la anterior en dondese encuentre el dato. Ya que lo encuentra cambia ese dato como la primera posiciónDisponible y lo apunta al siguiente nodo disponible. Si no encuentra el dato simplementedesplegara “Dato no encontrado”Algoritmo:EliBusq(Inicio, Info, Indice, Elemento)Temp → Indice[Inicio]Si Temp = InicioImprimir “Lista Vacia… Imposible Eliminar” y RetornarRepetir mientras Temp ≠ InicioSi Elemento = Info[Temp] entonces:Si Temp = Indice[Inicio] entonces:Indice[Inicio] → Indice[Indice[Inicio]]Si no:Indice[Temp2] → Indice[Temp]Indice[Temp] → DispDisp → TempRecorrido(Inicio, Info, Indice) y RetornarSi no:Temp2 → TempTemp → Indice[Temp]Imprimir “Dato no encontrado… Imposible Eliminar” y RetornarDiagrama:
  53. 53. 52Programa:#include <conio.h>#include<iostream.h>void Recorrido(intInfo[8],intIndice[8],intInicio,int Disp);void EliBusq(intInfo[8],intIndice[8],intInicio,intDisp,intElemento);void main(){intInfo[8]={0,10,0,9,5,3,0,20};intIndice[8]={5,7,6,1,0,3,-999,4};intInicio=0,Disp=2,Elemento,Res;cout<<"ListaOriginaln";Recorrido(Info,Indice,Inicio,Disp);cout<<"Que Numerodeseas Eliminar?";cin>>Elemento;EliBusq(Info,Indice,Inicio,Disp,Elemento);getch();}void Recorrido(intInfo[8],intIndice[8],intInicio,int Disp){intApuntador=Indice[Inicio];while(Apuntador!=Inicio){cout<<Info[Apuntador]<<endl;Apuntador=Indice[Apuntador];}}void EliBusq(intInfo[8],intIndice[8],intInicio,intDisp,int Elemento){intTemp=Indice[Inicio],Temp2;if(Temp==Inicio){cout<<"ListaVacia... ImposibleEliminar";return;}while(Temp!=Inicio){if(Elemento==Info[Temp]){if(Temp==Inicio)Inicio=Indice[Inicio];elseIndice[Temp2]=Indice[Temp];Indice[Temp]=Disp;Disp=Temp;Recorrido(Info,Indice,Inicio,Disp);return;}else{Temp2=Temp;Temp=Indice[Temp];}}cout<<"Dato noencontrado...ImposibleEliminar";return;}
  54. 54. 53Corrida:3.5 Listas Dobles:El Recorrido simplemente despliega los datos almacenados en el arreglo Info, conayuda de un segundo arreglo llamado Indice1 o Indice2 el cual guarda el orden en elque encuentran enlazados cada uno de los datos. Estos datos se pueden recorrer deArriba hacia Abajo o de Abajo hacia Arriba.Explicación:Dependiendo de la forma en la que se desea recorrer el Arreglo, la variable Apuntadortomara el valor de Indice1[Inicio], o de Fin. Después recorrerá el Arreglo mientras lacondición no se rompa (Dicha condición será diferente dependiendo el caso).Diagrama:BúsquedaLa Búsqueda su objetivo es encontrar un dato en el arreglo Info, si lo encuentra lodesplegara en la pantalla, si no lo encuentra no desplegara nada ya que el dato no se
  55. 55. 54encuentra en el arreglo Info. Esta búsqueda es más efectiva ya que compara el dato de lamitad y dependiendo el resultado, empezara la búsqueda por el Final o Inicio.Explicación:Primeramente usaremos un contador y la cabecera, esto nos permitirá determinar cuál esdato de la mitad. Para esto se utiliza el Recorrido el cual al encontrar el Dato de la mitad locopia ese dato a la cabecera con la cual se comparara para determinar por dónde empezar(Inicio y Fin).Diagrama:Inserción OrdenadaDefinición:La Inserción Ordenada busca la posición en donde será Insertado el Elemento y la posiciónanterior donde será Insertado, después de encontrar la posición en la que será Insertadoel Elemento nos regresa ese valor y lo mandamos al método de la Inserción después de unNodo.Explicación:Esta Inserción ordenada es similar a las anteriores aunque en este caso consta de mascomparación y movimientos de variables, esto se debe a que tenemos 2 arreglos que nosindican los movimientos y al insertar un dato ambos arreglos deben direccionarnuevamente.
  56. 56. 55Diagrama:Eliminación por BúsquedaLa Eliminación simplemente cambia los nodos para que el dato que se desea eliminar seael primer disponible, de esta forma ya no estará en el Arreglo de Info.Explicación:Lo primero que hace es ver si existe algún dato en la lista para eliminar, siIndice[Inicio] es igual a Inicio entonces solo desplegara “Imposible Eliminar”. De otraformas cambiar de Posición en Posición hasta encontrar el Elemento que sea deseaEliminar con ayudar de dos variables que guardan la Posición actual y la anterior en dondese encuentre el dato. Ya que lo encuentra cambia ese dato como la primera posiciónDisponible y lo apunta al siguiente nodo disponible. Si no encuentra el dato simplementedesplegara “Dato no encontrado”
  57. 57. 56Diagrama:Corrida:
  58. 58. 57#include <stdio.h>#include <conio.h>#include <iomanip.h>#include <iostream.h>class Alumno{private:char Nombre[10][30];intN_control[10],Edad[10],Indice1[10],Indice2[10],Inicio,Fin,Disp;public://ConstructorAlumno(){int i,j;Inicio=0;Fin=0;Disp=1;Indice1[Inicio]=-999;Indice2[Fin]=-999;for(i=1,j=2;i<9;i++,j++)Indice1[i]=j;Indice1[9]=-999;}//Funcion de Recorridovoid Recorrido(int op){int i=0,Temp;if(op==1){Temp=Indice1[Inicio];if(Temp!=-999){cout<<"Numero deControl"<<setw(19)<<"Nombre delAlumno"<<setw(5)<<"Edad"<<endl;while(Temp!=-999){if(i==(int(Edad[Inicio]/2))){N_control[Inicio]=N_control[i];strcpy(Nombre[Inicio],Nombre[i]);}cout<<setw(9)<<N_control[Temp]<<setw(22)<<Nombre[Temp]<<setw(9)<<Edad[Temp]<<endl;Temp=Indice1[Temp];i++;}}elsecout<<"Lista Vacia..";}if(op==2){Temp=Fin;if(Edad[Inicio]!=0){cout<<"Numero deControl"<<setw(19)<<"Nombre delAlumno"<<setw(5)<<"Edad"<<endl;while(Temp!=-999&&i<Edad[Inicio]){if(i==(int(Edad[Inicio]/2))){N_control[Inicio]=N_control[i];strcpy(Nombre[Inicio],Nombre[i]);}cout<<setw(9)<<N_control[Temp]<<setw(22)<<Nombre[Temp]<<setw(9)<<Edad[Temp]<<endl;Temp=Indice2[Temp];i++;}}elsecout<<"Lista Vacia..";}}//Funcion Sobrecargadade Busqueda paraEnterosint Busqueda(int Elem){if(Elem<N_control[Inicio]){intTemp=Indice1[Inicio];while(Temp!=-999){if(Elem==N_control[Temp]){gotoxy(1,10);cout<<"Numero deControl"<<setw(19)<<"Nombre delAlumno"<<setw(5)<<"Edad"<<endl;cout<<setw(9)<<N_control[Temp]<<setw(22)<<Nombre[Temp]<<setw(9)<<Edad[Temp]<<endl;return Temp;}elseTemp=Indice1[Temp];}}else{int Temp=Fin;while(Temp!=-999){if(Elem==N_control[Temp]){gotoxy(1,10);cout<<"Numero deControl"<<setw(19)<<"Nombre delAlumno"<<setw(5)<<"Edad"<<endl;cout<<setw(9)<<N_control[Temp]<<setw(22)<<Nombre[
  59. 59. 58Temp]<<setw(9)<<Edad[Temp]<<endl;return Temp;}elseTemp=Indice2[Temp];}}return -999;}//Funcion Sobrecargadade Busqueda de Cadenasde Caracteresint Busqueda(charElem[30]){if((strcmp(Elem,Nombre[Inicio]))<0){intTemp=Indice1[Inicio];while(Temp!=-999){if((strcmp(Elem,Nombre[Temp]))==0){gotoxy(1,10);cout<<"Numero deControl"<<setw(19)<<"Nombre delAlumno"<<setw(5)<<"Edad"<<endl;cout<<setw(9)<<N_control[Temp]<<setw(22)<<Nombre[Temp]<<setw(9)<<Edad[Temp]<<endl;return Temp;}elseTemp=Indice1[Temp];}}else{int Temp=Fin;while(Temp!=-999){if((strcmp(Elem,Nombre[Temp]))==0){gotoxy(1,10);cout<<"Numero deControl"<<setw(19)<<"Nombre delAlumno"<<setw(5)<<"Edad"<<endl;cout<<setw(9)<<N_control[Temp]<<setw(22)<<Nombre[Temp]<<setw(9)<<Edad[Temp]<<endl;return Temp;}elseTemp=Indice2[Temp];}}return -999;}//Funcion Sobrecargadade Orden para NumerosEnterosint Enca(int E_nc){intTemp=Indice1[Inicio],Temp2;if(Temp==-999||E_nc<N_control[Temp])return -999;Temp2=Indice1[Indice1[Inicio]];while(Temp2!=-999){if(E_nc<N_control[Temp2])return Temp;Temp=Temp2;Temp2=Indice1[Temp2];}return Temp;}//Funcion Sobrecargadade Orden para Cadenade Caracteresint Enca(charE_nom[30]){intTemp=Indice1[Inicio],Temp2;if(Temp==-999)return -999;if((strcmp(E_nom,Nombre[Temp]))<0)return Temp;Temp2=Indice1[Indice1[Inicio]];while(Temp2!=-999){if((strcmp(E_nom,Nombre[Temp2]))<0)return Temp;Temp=Temp2;Temp2=Indice1[Temp2];}return Temp;}//Funcion de Inserciónen un LugarDeterminadovoid InsLug(charE_nom[30],int E_nc,intE_edad,int Npos){if(Disp!=-999){Edad[Inicio]++;int Temp=Disp;Disp=Indice1[Disp];strcpy(Nombre[Temp],E_nom);N_control[Temp]=E_nc;Edad[Temp]=E_edad;if(Npos==-999){Indice1[Temp]=Indice1[Inicio];if(Indice2[Fin]==-999){Indice2[Temp]=Fin;Fin=Temp;}else
  60. 60. 59{Indice2[Temp]=Indice1[Inicio];Indice2[Indice1[Inicio]]=Temp;}Indice1[Inicio]=Temp;}else{Indice1[Temp]=Indice1[Npos];if(Fin==Npos){Indice2[Temp]=Fin;Fin=Temp;}else{Indice2[Temp]=Npos;Indice2[Indice1[Npos]]=Temp;}Indice1[Npos]=Temp;}}elsecout<<"Overflow..."<<endl;}//Funcion Sobrecargadapara Borrar un Datoque sea Enterovoid Borrar(int Elem){intTemp2,Temp=Indice1[Inicio];if(Temp==-999){cout<<"Lista Vacia...Imposible Eliminar";return;}while(Temp!=-999){if(Elem==N_control[Temp]){Edad[Inicio]--;if(Temp==Indice1[Inicio]){Indice1[Inicio]=Indice1[Indice1[Inicio]];Indice2[Indice1[Inicio]]=Inicio;}else if(Temp==Fin){Indice1[Temp2]=Indice1[Temp];Fin=Indice2[Fin];}else{Indice1[Temp2]=Indice1[Temp];Indice2[Indice1[Temp2]]=Temp2;}Indice1[Temp]=Disp;Disp=Temp;return;}else{Temp2=Temp;Temp=Indice1[Temp];}}cout<<"Dato noencontrado...Imposible Eliminar";return;}//Funcion Sobrecargadapara Borrar una Cadenade Caracteresvoid Borrar(charElem[30]){intTemp2,Temp=Indice1[Inicio];if(Temp==Inicio){cout<<"Lista Vacia...Imposible Eliminar";return;}while(Temp!=Inicio){if((strcmp(Elem,Nombre[Temp]))==0){Edad[Inicio]--;if(Temp==Indice1[Inicio]){Indice1[Inicio]=Indice1[Indice1[Inicio]];Indice2[Indice1[Inicio]]=Inicio;}else if(Temp==Fin){Indice1[Temp2]=Indice1[Temp];Fin=Indice2[Fin];}else{Indice1[Temp2]=Indice1[Temp];Indice2[Indice1[Temp2]]=Temp2;}Indice1[Temp]=Disp;Disp=Temp;return;}else{Temp2=Temp;Temp=Indice1[Temp];}}cout<<"Dato noencontrado...Imposible Eliminar";return;}}tec;main(){int op=0,res;char inom[30];int in_c,iedad;
  61. 61. 60while(op!=6){clrscr();cout<<"n1) Recorridopor Inicion2)Recorrido porFinaln3) Busquedan";cout<<"4)Insercionn5)Eliminar un Daton6)Salir"<<endl;gotoxy(1,1);cout<<"Que deseashacer: ";cin>>op;gotoxy(1,10);switch (op){case 1:tec.Recorrido(1);break;case 2:tec.Recorrido(2);break;case 3:cout<<"Que Numero deControl deseasbuscar?"<<endl;cin>>res;res=tec.Busqueda(res);if(res==-999)cout<<"Dato noencontrado";break;case 4:cout<<"Que nombrequieresInsertar?"<<endl;gets(inom);cout<<"Cual es suNumero deControl?"<<endl;cin>>in_c;cout<<"Cual es suEdad?"<<endl;cin>>iedad;res=tec.Enca(in_c);tec.InsLug(inom,in_c,iedad,res);break;case 5:cout<<"Que Numero deControl deseaseliminar?"<<endl;cin>>res;tec.Borrar(res);break;case 6:cout<<"Salida...";break;default:cout<<"OpcionErronea"<<endl;break;}getch();}}
  62. 62. 61Unidad 4: RecursividadCapacidad que tiene los métodos de invocarse a sí mismos, esta es una potenteherramienta en la informática.Con esta herramienta muchos algoritmos pueden simplificarse significativamente.Programa:#include <stdio.h>#include <conio.h>#include<string.h>#include<iomanip.h>#include<iostream.h>class Matematicas{public:void Tablas(intT,int B){if(B<11){cout<<T<<" X"<<setw(2)<<B<<" ="<<(T*B)<<endl;Tablas(T,B+1);}return;}longFactorial(long n){if(n<=1)return 1;elsereturn (n*Factorial(n - 1));}void Formula(intX){if(X<11){cout<<"f("<<X<<")="<<((X*X*X)+(2*X)+(3))<<endl;Formula(X+1);}return;}void Torres(intN,char Inicio,charAux,char Fin){if(N==1){cout<<Inicio<<" --> "<<Fin<<endl;return;}Torres(N-1,Inicio,Fin,Aux);cout<<Inicio<<" --> "<<Fin<<endl;Torres(N-1,Aux,Inicio,Fin);return;}}tec;main(){int t,b,op=0;while(op!=5){clrscr();cout<<"n1) Tablasde Multiplicarn2)Factorial de unNumeron";cout<<"3) FormulaLinealn4) Torresde Hanoin5)Salida"<<endl;gotoxy(1,1);cout<<"Que deseashacer: ";cin>>op;clrscr();switch(op){case 1:cout<<"Que Tablade MultiplicardeseasImprimir?"<<endl;cin>>t;cout<<"Desde queNumero deseasempezar amultiplicar (Menorque 10)"<<endl;cin>>b;tec.Tablas(t,b);break;case 2:cout<<"QueFactorial deseasconocer"<<endl;cin>>t;
  63. 63. 62cout<<t<<"! ="<<tec.Factorial(t)<<endl;break;case 3:cout<<"f(x) = x^3+ 2x + 3"<<endl;cout<<"Escribe laBase (Menor de10)"<<endl;cin>>t;tec.Formula(t);break;case 4:cout<<"Cuantosdiscos deseasmover?"<<endl;cin>>t;tec.Torres(t,A,B,C);break;case 5:cout<<"Salida...";break;default:cout<<"OpcionErronea...";break;}getch();}}
  64. 64. 63Unidad 5: Arboles5.1 Arboles Binarios:Un Árbol Binario es un conjunto de finito de Elementos, de nombre Nodos de forma que:El Árbol Binario es Vació si no tiene ningún elemento en él.El Árbol Binario contiene un Nodo Raíz y los dos que parten de él, llamados NodoIzquierdo y Nodo Derecho.Los Árboles tienen 3 Recorridos Diferentes los cuales son:• Pre-Orden• In-Orden• Post-Orden• Pre-OrdenEl Recorrido “Pre-Orden” lo recorre de la siguiente manera, viaje a través del ÁrbolBinario desplegando el Contenido en la Raíz, después viaje a través del Nodo Izquierdo ydespués a través del Nodo Derecho.Detalle:Temp toma el Valor de la Raíz y compara si el Árbol tiene algún Elemento, de otra maneraDesplegara “Árbol Vació…” y terminara el método. Si el Árbol tiene elementos dentro deél, lo recorrerá y viajara a través de los Arreglos Izq y Der para determinar qué valormeter en la Pila y en Temp para de esta manera imprimir el siguiente Elementocorrespondiente.Algoritmo:PreOrd(Arbol, Der, Izq, Pila, Raiz)Temp → RaizTop →Pila[Top] → NuloSi Raiz = NuloImprimir “Árbol Vació…” y SalirRepetir mientras Temp ≠ NuloImprimir Arbol[Temp]Si Der[Temp] ≠ NuloTop → Top + 1Pila[Top] → Der[Temp]Si Izq[Temp] ≠ NuloTemp → Izq[Temp]Si no:Temp → Pila[Top];Top → Top - 1Fin del cicloSalir
  65. 65. 64Diagrama:Corrida:In-OrdenEl Recorrido “In-Orden” lo recorre de la siguiente manera, viaje a través del ÁrbolBinario desplegando el Contenido en el Nodo Izquierdo después la Raíz y finalmente viajaa través del Nodo Derecho.Detalle:Temp toma el Valor de la Raíz y compara si el Árbol tiene algún Elemento, de otra maneraDesplegara “Árbol Vació…” y terminara el método. Si el Árbol tiene elementos dentro deél, lo recorrerá y viajara a través de los Arreglos Izq y Der para determinar qué valormeter en la Pila y en Temp para de esta manera imprimir el siguiente Elementocorrespondiente.
  66. 66. 65Algoritmo:PreOrd(Arbol, Der, Izq, Pila, Raiz)Temp → RaizTop →Pila[Top] → NuloSi Raiz = NuloImprmir “Arbol Vacio…” y SalirEtiqueta:Mientras Temp ≠ NuloTop → Top + 1Pila[Top] → TempTemp → Izq[Temp]Fin del cicloTemp → Pila[Top]Top → Top - 1Mientras Temp ≠ NuloImprimir Arbol[Temp]Si Der[Temp] ≠ NuloTemp → Der[Temp]Ir a EtiquetaTemp → Pila[Top]Top → Top - 1Fin del cicloSalirDiagrama:
  67. 67. 66Corrida:In-OrdenEl Recorrido “In-Orden” lo recorre de la siguiente manera, viaje a través del Árbol Binariodesplegando el Contenido en el Nodo Izquierdo después el Nodo Derecho y finalmenteviaja a través de la Raiz.Detalle:Temp toma el Valor de la Raíz y compara si el Árbol tiene algún Elemento, de otra maneraDesplegara “Árbol Vació…” y terminara el método. Si el Árbol tiene elementos dentro deél, lo recorrerá y viajara a través de los Arreglos Izq y Der para determinar que valor meteren la Pila y en Temp para de esta manera imprimir el siguiente Elemento correspondiente.Algoritmo:PostOrd(Arbol, Der, Izq, Pila, Raiz)Temp → RaizTop →Pila[Top] → NuloSi Raiz = NuloImprimir “Arbol Vacio…” y SalirEtiqueta:Mientras Temp ≠ NuloTop → Top + 1Pila[Top] → TempSi Der[Temp] ≠ NuloTop → Top + 1Pila[Top] → - (Der[Temp])Temp → Izq[Temp]Temp → Pila[Top]Top → Top - 1Fin del cicloMientras Temp ≥ 0Imprimir Arbol[Temp]
  68. 68. 67Si Arbol[Temp] = Info[Raiz]SalirTemp → Pila[Top]Top → Top - 1Fin del cicloSi Temp < 0Temp = -(Temp)Ir a EtiquetaSalirDiagrama:Corrida:
  69. 69. 68BúsquedaLa Búsqueda es Similar a todas los Métodos anteriores de Búsqueda, simplemente efectúaun recorrido comparando el Elemento que deseas encontrar contra cada uno de losElementos en los Arreglos.Detalle:El Algoritmo de Búsqueda compara el Elemento a buscar con cada uno de los datos denuestro Árbol, compara si el Elemento con el Nodo Raíz, si no se encuentra en la Raíz…compara Elemento contra la Raíz para empezar a viajar por el Árbol respectivamente, usaun método similar al anterior hasta encontrar el Elemento. De otra forma la búsqueda esfallida.Algoritmo:Busqueda(Arbol, Der, Izq,Pila, Raiz, Elem)Si Raiz = NuloImprimir “Arbol Vacio”Pos → NuloPad → NuloRegresar Pos y PadSalirSi Elem = Arbol[Raiz]Imprimir “Elemento Encontrado”Pos → RaizPad → NuloRegresar Pos y PadSalirSi Elem < Arbol[Raiz]Temp → Izq[Raiz]Temp2 → RaizSi no:Temp → Der[Raiz]Temp2 → RaizMientras Temp ≠ NuloSi Elem = Arbol[Temp]Imprimir “ElementoEncontrado…”Pos → TempPad → Temp2Regresar Pos y PadSalirSi Elem < Arbol[Temp]Temp2 → TempTemp → Izq[Temp]Si no:Temp2 → TempTemp → Der[Temp]Fin del cicloImprimir “Elemento noEncontrado…”Pos → NuloPad → Temp2Regresar Pos y PadSalir
  70. 70. 69Diagrama:Corrida:
  71. 71. 70#include <conio.h>#include <iostream.h>class Arbol{private:int Top,Pila[10];intInfo[10],Izq[10],Der[10],Raiz,Disp;public:Arbol(){intin[10]={0,0,0,0,0,0,0,0,0,0};for(int i=0;i<10;i++){Info[i]=0;Izq[i]=i+1;Der[i]=-999;Pila[i]=0;}Top=0;Disp=0;Raiz=-999;Izq[9]=-999;}void PreOrd(void){int Temp=Raiz;Top=0;Pila[0]=-999;if(Raiz==-999){cout<<"ArbolVacio..."<<endl;return;}while(Temp!=-999){cout<<Info[Temp]<<endl;if(Der[Temp]!=-999){Top++;Pila[Top]=Der[Temp];}if(Izq[Temp]!=-999){Temp=Izq[Temp];}else{Temp=Pila[Top];Top--;}}}void InOrd(void){int Temp=Raiz,Top=0;Pila[0]=-999;if(Raiz==-999){cout<<"ArbolVacio..."<<endl;return;}Back:while(Temp!=-999){Top++;Pila[Top]=Temp;Temp=Izq[Temp];}Temp=Pila[Top];Top--;while(Temp!=-999){cout<<Info[Temp]<<endl;if(Der[Temp]!=-999){Temp=Der[Temp];goto Back;}Temp=Pila[Top];Top--;}}void PostOrd(void){int Temp=Raiz;Top=0;Pila[0]=-999;if(Raiz==-999){cout<<"ArbolVacio..."<<endl;return;}Back1:while(Temp!=-999){Top++;Pila[Top]=Temp;if(Der[Temp]!=-999){Top++;Pila[Top]=-Der[Temp];}Temp=Izq[Temp];}Temp=Pila[Top];Top--;while(Temp>=0){cout<<Info[Temp]<<endl;if(Info[Temp]==Info[Raiz])return;Temp=Pila[Top];Top--;}if(Temp<0){Temp=-Temp;goto Back1;}}void Busqueda(intPosPad[2],int Elem){int Temp,Temp2;if(Raiz==-999){PosPad[0]=-999;PosPad[1]=-999;cout<<"ArbolVacio..."<<endl;return;}if(Elem==Info[Raiz]){PosPad[0]=Raiz;
  72. 72. 71PosPad[1]=-999;cout<<"ElementoEncontrado..."<<endl;return;}if(Elem<Info[Raiz]){Temp=Izq[Raiz];Temp2=Raiz;}else{Temp=Der[Raiz];Temp2=Raiz;}while(Temp!=-999){if(Elem==Info[Temp]){cout<<"ElementoEncontrado..."<<endl;PosPad[0]=Temp;PosPad[1]=Temp2;return;}if(Elem<Info[Temp]){Temp2=Temp;Temp=Izq[Temp];}else{Temp2=Temp;Temp=Der[Temp];}}PosPad[0]=-999;PosPad[1]=Temp2;cout<<"Elemento noEncontrado..."<<endl;}void InsOrd(int Elem){int PosPad[2],Temp;if(Disp!=-999){Busqueda(PosPad,Elem);clrscr();if(PosPad[0]!=-999){cout<<"ElementoExistente... ImposibleInsertar..."<<endl;return;}Temp=Disp;Disp=Izq[Disp];Info[Temp]=Elem;PosPad[0]=Temp;Izq[Temp]=-999;Der[Temp]=-999;if(PosPad[1]==-999)Raiz=Temp;else if(Elem<Info[PosPad[1]])Izq[PosPad[1]]=Temp;elseDer[PosPad[1]]=Temp;cout<<"ElementoInsertado..."<<endl;return;}cout<<"Arbol Lleno...ImposibleInsertar..."<<endl;}void Eliminar(intElem){int PosPad[2];Busqueda(PosPad,Elem);clrscr();if(PosPad[0]==-999){cout<<"El Elemento nose Encuentra en elArbol... ImposibleEliminar..."<<endl;return;}if(Der[PosPad[0]]!=-999&&Izq[PosPad[0]]!=-999)CasoB(PosPad);elseCasoA(PosPad);Izq[PosPad[0]]=Disp;Disp=PosPad[0];}void CasoA(intPosPad[2]){int Temp;if(Izq[PosPad[0]]==-999&&Der[PosPad[0]]==-999)Temp=-999;elseif(Izq[PosPad[0]]!=-999)Temp=Izq[PosPad[0]];elseTemp=Der[PosPad[0]];if(PosPad[1]!=-999){if(PosPad[0]==Izq[PosPad[1]])Izq[PosPad[1]]=Temp;elseDer[PosPad[1]]=Temp;}elseRaiz=Temp;}void CasoB(intPosPad[2]){intPosPad2[2],Temp=Der[PosPad[0]],Temp2=PosPad[0];while(Izq[Temp]!=-999){Temp2=Temp;Temp=Izq[Temp];}PosPad2[0]=Temp;PosPad2[1]=Temp2;CasoA(PosPad2);if(PosPad[1]!=-999){if(PosPad[0]==Izq[PosPad[1]])Izq[PosPad[1]]=PosPad2[0];
  73. 73. 72elseDer[PosPad[1]]=PosPad2[0];}elseRaiz=PosPad2[0];Izq[PosPad2[0]]=Izq[PosPad[0]];Der[PosPad2[0]]=Der[PosPad[0]];}}tec;main(){intPosPad[2],res,op=0;while(op!=7){clrscr();cout<<"n1)Pre-Ordenn2)In-Ordenn3)Post-Ordenn4)Busquedan5)Insercionn6)Eliminarn7)Salir"<<endl;gotoxy(1,1);cout<<"Que deseashacer?: ";cin>>op;gotoxy(1,10);switch (op){case 1:tec.PreOrd();break;case 2:tec.InOrd();break;case 3:tec.PostOrd();break;case 4:cout<<"Que Numerodeseas buscar?"<<endl;cin>>res;tec.Busqueda(PosPad,res);break;case 5:cout<<"Que NumeroquieresInsertar?"<<endl;cin>>res;tec.InsOrd(res);break;case 6:cout<<"Que NumeroquieresEliminar?"<<endl;cin>>res;tec.Eliminar(res);break;case 7:cout<<"Salida...";break;default:cout<<"OpcionErronea"<<endl;break;}getch();}}
  74. 74. 735.2 Arboles en MontonEl Árbol en Montón consiste en el ordenamiento de un conjunto de Elemento en un soloarreglo.Trabajaremos sobre la siguientes Operaciones en este Tema:1. Inserción2. Búsqueda3. Eliminación4. Recorrido (Ordenado)InserciónEl Concepto de Inserción ya es familiar para nosotros y sabemos que para realizar elmismo no resulta complejo el procedimiento.Pero en los Árboles en Montón es uno de los Métodos más largos para efectuarlo.Detalle:Básicamente lo que hace estos Algoritmos es la Inserción Ordenada. Primero comparan sies posible insertar algún Elemento al Arreglo, si es posible hacerlo Ingresa el Elemento a laÚltima posición.Después básicamente acomoda el Arreglo con el Método de la Burbuja llamando a otraserie de Métodos.Algoritmos:Insertar(Arbol, N, Elemento)Si N<25Arbol[N] -> aN -> N + 1OrdMon(Arbol, N)Salir//Fin de la condición//Imprimir "Árbol Lleno..."SalirOrdMon(Arbol, Total)ConstMon(Arbol, Total)Mientras Total > 1Total -> Total - 1Burbuja(0, Total)RecMon(Total, 0)//Fin del ciclo//SalirConstMon(Arbol, Total)v -> (Total/2) - 1Mientras v ≥ 0RecMon(Arbol, Total, v)v -> v - 1//Fin del ciclo//Salir----RecMon(Arbol, Total, v)w -> 2*v+1Mientras w < TotalSi (w+1) < TotalSi Arbol[w+1] > Arbol[w]w++//Fin de la condición//Fin de la condiciónSi Arbol[v] ≥ Arbol[w]Salir//Fin de la condición//Burbuja(Arbol, v, w)v -> ww -> 2*v+1//Fin del ciclo//Salir----Burbuja(Arbol, v, w)t -> Arbol[v]Arbol[v] -> Arbol[w]Arbol[w] -> tSalir
  75. 75. 74Diagrama:Corrida:BúsquedaEl Concepto de Búsqueda es sencillo, simplemente es un método de búsqueda lineal.Existen 3 posible resultados:1. Que el Árbol este Vació y no se puede realizar la búsqueda.2. Que el Elemento sea encuentre en el Árbol3. Que el Elemento no esté dentro del ÁrbolDetalle:Se manda al Método Búsqueda el Dato que se desea buscar, se acomoda el Árbol enOrden en caso que no estuviera Ordenado y después compara con cada uno de los datos.
  76. 76. 75Algoritmos:**Busqueda(Arbol, N, Elemento)**Si N ≠ 0OrdMon(Arbol, N)i ->Mientras i < N;i++)Si Arbol[i] = ElementoImprimir "Elemento Encontrado..."Salir//Fin de la condición//i -> i + 1//Fin del ciclo//Imprimir "El Elemento no esta en el Árbol..."Salir//Fin de la condición//Imprimir "Árbol Vació..."SalirDiagrama:
  77. 77. 76Corrida:EliminaciónEl Concepto de Eliminación consiste en la búsqueda de un Elemento y sacarlo del Arreglo.Existen 3 casos Diferentes;1. Que el Árbol este Vació y no se puede realizar la eliminación2. Que el Elemento sea encuentre en el Árbol y sea eliminado3. Que el Elemento no esté dentro del Árbol por lo tanto no se eliminaDetalle:Vemos si el Árbol tiene Elementos insertados en él, de otra forma será imposible realizarla Eliminación ya que esta Vació. Después si el Árbol tiene Elementos lo ordenamos yhacemos un búsqueda lineal para encontrar el dato. Después usamos el método de laBurbuja para dejar el Elemento Eliminado hasta el final y le Restamos a N un Elemento.Algoritmo:Eliminar(Arbol, N, Elemento)Si N ≠ 0OrdMon(Arbol, N)i ->Mientras I < NSi Arbol[i] = Elementoj -> i + 1Mientras j < Nt -> Arbol[i]Arbol[i] -> Arbol[j]Arbol[j] -> tj -> j + 1//Fin del ciclo//N -> n - 1Imprimir "ElementoEliminado..."Salir//Fin de la condición//i -> i + 1//Fin del ciclo//Fin de la condiciónImprimir "Arbol Vacio...Imposible Eliminar..."Salir
  78. 78. 77Diagrama:Corrida:Recorrido (Ordenado)El Recorrido simplemente ira desplegando cada uno de los Elementos del Árbol. Soloexisten 2 posibles casos:1. Que el Árbol este Vació y no se pueda recorrer2. El Árbol tenga Elementos para desplegarDetalle:Comparamos para comprobar que el Árbol tiene Elementos dentro de el, de ser asíDesplegamos cada uno de ellos. De otra manera Desplegamos Árbol Vació.
  79. 79. 78Algoritmo:Recorrido(Arbol, N)Si N ≠ 0i ->Mientras i < NImprimir Arbol[i]i -> i + 1//Fin del ciclo//Salir//Fin de la condición//Imprimir "Arbol Vacio..."SalirCorrida:
  80. 80. 79#include <conio.h>#include <iostream.h>class Arbol_Monton{private:int Arbol[25];int N;public:Arbol_Monton(){for(int i=0;i<25;i++)Arbol[i]=0;N=0;}void Insertar(int a){if(N<25){Arbol[N]=a;N++;OrdMon(N);return;}cout<<"ArbolLleno..."<<endl;}void Eliminar(int a){int t;if(N!=0){OrdMon(N);for(int i=0;i<N;i++){if(Arbol[i]==a){for(int j=i+1;j<N;j++){t=Arbol[i];Arbol[i]=Arbol[j];Arbol[j]=t;}N--;cout<<"ElementoEliminado..."<<endl;return;}}}cout<<"Arbol Vacio...ImposibleEliminar..."<<endl;}void Busqueda(int a){if(N!=0){OrdMon(N);for(int i=0;i<N;i++)if(Arbol[i]==a){cout<<"ElementoEncontrado..."<<endl;return;}cout<<"El Elemento noesta en elArbol..."<<endl;return;}cout<<"ArbolVacio..."<<endl;}void OrdMon(int n){ConstMon(n);while(n>1){n--;Burbuja(0,n);RecMon(n,0);}}void ConstMon(int n){for(int v=n/2-1;v>=0;v--)RecMon(n,v);}void RecMon(int n,intv){int w=2*v+1;while(w<n){if(w+1<n)if(Arbol[w+1]>Arbol[w])w++;if(Arbol[v]>=Arbol[w])return;Burbuja(v,w);v=w;w=2*v+1;}}void Burbuja(int i,intj){int t=Arbol[i];Arbol[i]=Arbol[j];Arbol[j]=t;}void Recorrido(){if(N!=0){for(int i=0;i<N;i++)cout<<Arbol[i]<<endl;return;}cout<<"ArbolVacio..."<<endl;}}tec;main(){int res,op=0;while(op!=5){clrscr();cout<<"n1)Recorridon2)Busquedan3)Insercionn4)Eliminarn5)Salir"<<endl;gotoxy(1,1);cout<<"Que deseashacer?: ";cin>>op;gotoxy(1,10);
  81. 81. 80switch (op){case 1:tec.Recorrido();break;case 2:cout<<"Que Numerodeseas buscar?"<<endl;cin>>res;tec.Busqueda(res);break;case 3:cout<<"Que NumeroquieresInsertar?"<<endl;cin>>res;tec.Insertar(res);break;case 4:cout<<"Que NumeroquieresEliminar?"<<endl;cin>>res;tec.Eliminar(res);break;case 5:cout<<"Salida...";break;default:cout<<"OpcionErronea"<<endl;break;}getch();}}
  82. 82. 81Unidad 6: Ordenamientos InternosIntroducción:En esta Unidad explicaremos 4 algoritmos para el Ordenamiento de Arreglos en MemoriaRam.A continuación mencionaremos los diferentes métodos para ordenar:1. Burbuja2. ShellSort3. RadixSort4. QuickSortBurbujaEl método de la burbuja es una comparación lineal con cada uno de los elementos, elelemento que sea menor contra el que se está comparado intercambiaran posiciones.Este método no es recomendado para grandes comparaciones, ya que es un proceso muylento y requiere de una gran cantidad de Memoria Ram.Programa:#include<conio.h>#include<iostream.h>class Lista{private:int Lista[10],N;public:Lista(){for(inti=0;i<10;i++)Lista[i]=0;N=0;}void Burbuja(void){if(N!=0){int i,j,aux;for(i=0;i<9;i++)for(j=i+1;j<10;j++)if(Lista[i]<Lista[j]){aux=Lista[i];Lista[i]=Lista[j];Lista[j]=aux;}cout<<"ListaOrdenada..."<<endl;return;}cout<<"ListaVacia..."<<endl;}void Busqueda(intElem){if(N!=0){for(inti=0;i<N;i++)if(Lista[i]==Elem){cout<<"El"<<Elem<<" esta enla Lista"<<endl;return;}}cout<<"ListaVacia..."<<endl;return;}void Insertar(intElem){if(N<10){Lista[N]=Elem;N++;cout<<"El"<<Elem<<" fueInsertado"<<endl;return;}cout<<"ListaLlena... ImposibleInsertar"<<endl;return;}void Eliminar(int
  83. 83. 82Elem){if(N!=0){for(inti=0;i<N;i++)if(Lista[i]==Elem){Lista[i]=0;Burbuja();N--;return;}}cout<<"ListaVacia... ImposibleEliminar..."<<endl;return;}void Recorrido(){if(N!=0){for(inti=0;i<N;i++)cout<<Lista[i]<<endl;}cout<<"ListaVacia..."<<endl;}}tec;main(){int op=0,res;while(op!=6){clrscr();cout<<"n1)Recorridon2)Ordenarn3)Busquedan4)Insercionn5)Eliminar unDaton6)Salir"<<endl;gotoxy(1,1);cout<<"Que deseashacer: ";cin>>op;gotoxy(1,10);switch (op){case 1:tec.Recorrido();break;case 2:tec.Burbuja();break;case 3:cout<<"Que Numerode Control deseasbuscar?"<<endl;cin>>res;tec.Busqueda(res);break;case 4:cout<<"Que NumeroDeseasInsertar?"<<endl;cin>>res;tec.Insertar(res);break;case 5:cout<<"Que Numerode Control deseasEliminar?"<<endl;cin>>res;tec.Eliminar(res);break;case 6:cout<<"Salida...";break;default:cout<<"OpcionErronea"<<endl;break;}getch();}}

×