Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Curso de Estructura C++
Curso de Estructura C++
UNIVERSIDAD DE GUADALAJARA
Departamento de Ciencias Computacionales
Academia de Computacin Bsica
Estructura de datos
2. Ordenamientos y bsquedas
2.1 Arreglos
2.2 Ordenamiento
2.2.1 Burbuja y Burbuja Mejorado (Bubble Sort)
2.2.2 Ordenamiento por Insercin Directa (InsertSort)
2.2.3 Ordenamiento por seleccin (SelectSort)
2.2.4 Ordenamiento Shell (ShellSort)
2.2.5 Ordenamiento Mezcla (MergeSort)
2.3 Bsquedas
2.3.1 Bsqueda Secuencial
2.3.2 Bsqueda Binaria
Pag 1
Estructura de datos
6. Grafos.
Pag 2
Estructura de datos
Tipos de datos.
Los diferentes objetos de informacin con los que un programa C trabaja se
conocen colectivamente como datos. Todos los datos tienen un tipo asociado
con ellos
Tipos predefinidos
Tipo Largo Rango
unsigned char 8 bits 0 to 255
Char 8 bits -128 to 127
enum 16 bits -32,768 to 32,767
unsigned int 16 bits 0 to 65,535
short int 16 bits -32,768 to 32,767
int 16 bits -32,768 to 32,767
unsigned long 32 bits 0 to 4,294,967,295
long 32 bits -2,147,483,648 to 2,147,483,647
float 32 bits 3.4 * (10**-38) to 3.4 * (10**+38)
double 64 bits 1.7 * (10**-308) to 1.7 * (10**+308)
long double 80 bits 3.4 * (10**-4932) to 1.1 *
(10**+4932)
Constantes
Las constantes se presentan en expresiones como
c= Y
2* (x + 7) 33
kilmetros = 1.609344 * millas
Adems de tener un valor, una constante tambin tiene un tipo de dato
inherente. Los tipos de datos posibles en las constantes dependen de la
Pag 3
Estructura de datos
int 0 77 5013
long 0L 77L 5013L
double 0.003 1.0|| 0.5013e-2
char a b c
cadena est es una constante de cadena
Segundos = 60 * 60 * 24 * das;
Segundos = 86400 * das;
#include mi_archivo
Pag 4
Estructura de datos
Cadena_de_control y lista_de_argumentos
printf(ABC);
printf(%s,ABC);
printf(%c%c%c,A,B,C);
Los apstrofos que encierran cada letra se emplean para designar constantes
de caracteres de acuerdo con esto, A es la constante de carcter que
corresponde a la letra A mayscula. El formato %c imprime el valor de una
expresin como un carcter.
printf()
Carcter
de
conversi Cmo se describe el argumento
n correspondiente
C Como carcter
D Como un entero decimal
E Como nmero de punto flotante en notacin
cientfica
F Como un nmero de punto flotante
G En el formato-e o el formato-f el que sea ms
corto
S Como una cadena de caracteres
Pag 5
Estructura de datos
scanf(%d,&x);
Contiene el formato %d, el cual provoca que scanf() interprete los caracteres
de entrada como un entero decimal y que coloque el valor en la direccin x.
Carcter
de
conversi Los caracteres de la entrada se convierten en
n
c Un carcter
d Un entero decimal
f Un nmero de punto flotante (float)
lf Un nmero de punto flotante (double)
s Una cadena
Funciones
La definicin de una funcin consiste en un encabezamiento y un cuerpo. De
manera explicita, podramos decir que es un bloque o una proposicin
compuesta. Si hay declaraciones deben aparecer al inicio del bloque antes de
cualquier proposicin ejecutable. El encabezamiento puede ser tan slo un
identificador y unos parntesis. Un ejemplo sencillo es :
escr_direcc() /* encabezamiento*/
/* el cuerpo es cuanto est entre llaves */
{
printf(\n\n%s\n%s\n%s\n%s\n%s\n\n,
********************,
** SAN NICOLAS *,
** El POLO NORTE *,
** LA TIERRA *,
*******************);
}
Donde quiera que un programa identifique a esta funcin, la expresin har
que se invoque la funcin.
Pag 6
Estructura de datos
La proposicin return
La proposicin return puede incluir u omitir una expresin.
return;
return (377);
return (a * b);
return (++x);
return ++x;
Pag 7
Estructura de datos
Estructura de un programa
La base de la programacin en C es la funcin, pues constituye una parte
fundamental de la codificacin en el proceso de solucin de problemas. Todas
las funciones estn en el mismo nivel externo; no se pueden anidar unas en
otras. Un programa contiene una o ms funciones en uno o ms archivos. Una
de las funciones es main() donde se inicia la ejecucin del programa. El resto
de las funciones se llaman desde main() y desde el interior de otras
main()
Todo programa tiene una funcin main donde inicia la ejecucin; los
parntesis que van despus de main indican al compilador que se trata
de una funcin
{
Las llaves encierran al cuerpo de la funcin; tambin se usan para
agrupar varias proposiciones.
printf()
Pag 8
Estructura de datos
}
La llave derecha hace pareja con la llave de una funcin y da por
terminada la funcin main
Identificadores.
Los identificadores representan objetos de un programa ( constantes,
variables, tipos de datos procedimientos, funciones, unidades, programas y
campos de registros). Un identificador es una secuencia de caracteres que
pueden ser de cualquier longitud, pero slo los primeros 63 caracteres son
significativos.
Palabras reservadas.
Las palabras reservadas en C tienen un significado especial y no se pueden
utilizar para otros propositos
Operadores aritmticos
Los operadores aritmticos (+,-,*) pueden ser utilizados con tipos enteros o
reales, si ambos son enteros el resultado es entero si uno es real el resultado
es real.
2+3 =5
2 +3.0 = 5.0
2.0 + 3 = 5.0
2.0 + 3.0 = 5.0
Pag 9
Estructura de datos
Operadores de asignacin
+= C += 7 c = c +7
-= D -= 4 d=d-4
*= e*=5 e = e* 5
/= F /= 3 f=f/3
%= g %= 9 g=g%9
Prioridad de operadores
Cuando una expresin aritmtica se evala, el resultado es siempre un
nmero. Cuando en una expresin aparecen dos o ms operadores, qu
operacin se realiza primero?.
Pag 10
Estructura de datos
1. Todas las subexpresiones entre parntesis se evalan primero. Las subexpresiones con
parntesis anidados se evalan de dentro a afuera; el parntesis ms interno se evala
primero.
2. Prioridad de operaciones. Dentro de una misma expresin o subexpresin, los
operadores se evalan en el siguiente orden:
*,/,% primero
+,- ltimo
3. Regla asociativa izquierda. Los operadores en una misma expresin o subexpresin con
igual nivel de prioridad (tal como * y /) se evalan de izquierda a derecha.
%
*
Pag 11
Estructura de datos
Operadores de relacin
Se utilizan para expresar condiciones y describen una relacin entre dos
valores.
Expresin valor
6.7315 < 6.7342 0
-124.2 < 0.003 1
8 == 8.0 1
A < B 1
Z < H 1
Operadores lgicos
Las expresiones lgicas pueden combinarse para formar expresiones ms
complejas utilizando los operadores lgicos: &&, || y !. Estos operadores se
utilizan con constantes lgicas de forma similar al modo en que los operadores
aritmticos se utilizan con las constantes numricas, estos operadores trabajan
con operandos que son expresiones lgicas.
Pag 12
Estructura de datos
Operador &&
1 1 1
1 0 0
0 1 0
0 0 0
Operador ||
Operando1 Operando2 Operando1 || Operando2
1 1 1
1 0 1
0 1 1
0 0 0
Operador !
Operando1 ! Operando1
1 0
Operador Prioridad
! Mas alta (se evala primero)
*,/,%,&& -
+,-,|| -
< , <= , == , <> , >= , > Mas baja se evala al ultimo
Si existen parntesis las Interior se evalan primero
expresiones de su
Pag 13
Estructura de datos
* - -
<
5)
> >
||
&&
Estructuras de control
Selectivas.
La sentencia if.
Sentencia de control que dirige a la computadora para ejecutar una sentencia
si la expresin es verdadera, y otra en caso de ser falsa.
Formato
if (expresin lgica)
proposicion1
else Pag 14
proposicin2
proposicin siguiente
Estructura de datos
En muchos casos se desea que una determinada accin slo ejecute si una
cierta condicin es verdadera y no realizar ninguna accin si la condicin es
falsa.
if (condicin)
sentencia
Sentencia compuesta.
{
sentencia 1;
sentencia 2;
sentencia 3;
-
-
sentencia n;
}
Ejemplo:
#include <stdio.h>
main()
{
if (grado >=90)
Printf(A\n);
else if (grado >=80)
Printf(B\n);
else if (grado >=70)
Printf(C\n);
else if (grado >=60)
Printf(D\n);
else if (grado >=50)
Printf(F\n);
}
La sentencia switch
La sentencia switch se utiliza para elegir entre diferentes alternativas.
switch (expresion_entera){
case 1 : sentencia1;break;
case 2 : sentencia2;break;
case 3 : sentencia3;break;
-
-
case n : sentencian;break;
[default :sentencia x]
} {case}
Pag 15
Estructura de datos
/*Contando calificaciones*/
#include <stdio.h>
main()
{
int Letra;
int acontador = 0, bcontador =0, contador = 0,
dcontador =0, fcontador = 0;
return 0;
Pag 16
Estructura de datos
Mete la letra de su c
Mete el carcer EOF para finalizar las entradas
A
B
C
C
A
D
F
C
E
Letra de entrada incorrecta meta una nueva calificacin
D
A
B
Totales de cada calificacin
A: 3
B: 2
C: 3
D: 2
F: 1
La sentencia while.
Pag 17
Estructura de datos
La sentencia do while.
Una variante de la sentencia while es la sentencia do while, esta sentencia
especifica un bucle condicional que se repite hasta que la condicin se hace
falsa.
do
Sentencia 1
-
-
-
sentencia n
while (expresin lgica);
Pag 18
Estructura de datos
#include <stdio.h>
main()
{
int contador = 1;
do {
printf (%d , contador);
}
while (++contador <= 10);
return 0;
}
La sentencia for.
Esta sentencia requiere que sepamos por anticipado el nmero de veces que se
ejecutan las sentencias del interior del bucle.
#include <stdio.h>
main()
{
int contador;
/*inicializacin, condicin de repeticin, e incremento*/
for (contador=1; contador <=10; contador++)
printf(%d\n,contador);
return 0;
}
Pag 19
Estructura de datos
main()
{
int sum = 0, number;
for (number = 2; number <=100; number +=2)
sum += number;
printf(Sum es %d\n,sum);
return 0;
}
Sum es 2550
Ordenamientos y bsquedas
Arreglos
Un arreglo es una estructura de datos en la que se almacena una coleccin de
datos del mismo tipo, es una lista de un nmero finito n de elementos del
mismo tipo que se caracteriza por:
1. Almacenar los elementos del arreglo en memoria continua.
2. Tener un nico nombre de variable que representa todos los elementos y
estos a sus vez se diferencian por un ndice o subndice.
3. Acceso directo o aleatorio a los elementos individuales del arreglo.
Pag 20
Estructura de datos
float x[8];
C[a + b] +=2;
Aade 2 al elemento del arreglo c[11]. Note que un nombre de arreglo con
subndice es un Ivalue que puede ser utilizado al lado izquierdo de una
asignacin.
Para imprimir la suma de los valores contenidos en los primeros tres elementos
del arreglo x, escribiramos
C= x[6] / 2;
Pag 21
Estructura de datos
int c[12];
es utilizada. La memoria puede ser reservada para varios arreglos dentro de
una sola declaracin, Para reservar 100 elementos para el arreglo entero b y
27 elementos para el arreglo entero x, se puede utilizar la siguiente
declaracin
/* inicializa el arreglo*/
#include <stdio.h>
main()
{
int n[10], i;
for (i = 0; i <= 9; i++) /*inicializa el arreglo*/
n[i] = 0;
printf(%s%13s\n, Elemento, Value);
for(i= 0; i <= 9; i++) /*imprime arreglo*/
printf(%7d%13d\n,i, n[i]);
return 0;
}
Elemento Value
0 0
1 0
2 0
3 0
4 0
5 0
6 0
7 0
8 0
9 0
Pag 22
Estructura de datos
main()
{
int a [SIZE] = {1, 3, 5, 4, 7, 2, 99, 16, 45, 67, 89, 45}
i, total =0;
for (i=0; i <=SIZE 1;i++)
total += a[i]
printf(El total del valor de los elementos del arreglo es %d\n,total);
return 0;
}
El primer ciclo for toma las respuestas del arreglo respuestas una por una e
incrementa uno de los diez contadores (frecuencia[1] hasta frecuencia [10] )
en el arreglo frecuencia. El enunciado clave es
++frecuencia[respuestas[pregunta]
Este enunciado incrementa el contador frecuencia apropiado, dependiendo del
valor de respuestas[pregunta]. Por ejemplo cuando la variable del contador
pregunta es 0, respuestas[pregunta] es 1 y por lo tanto, ++frecuencia
[respuesta[pregunta]]; se interpreta en realidad como
++frecuencia[1];
#include <stdio.h>
#define RESPUESTAS_SIZE 40
#define FRECUENCIA_SIZE 11
Pag 23
Estructura de datos
main()
{
int answer, rating;
int respuestas[RESPUESTAS_SIZE] = {1, 2, 6, 4, 8, 5, 9, 7, 8, 10, 1, 6,
3, 8, 6, 10, 3, 8, 2, 7, 6, 5, 7, 6, 8, 6, 7, 5, 6, 6, 5, 6, 7, 5, 6, 4, 8, 6,
8, 10);
int frecuencia[FRECUENCIA_SIZE] = {0};
for (pregunta = 0; pregunta <= RESPUESTA_SIZE 1; answer++)
++frecuencia[respuestas[pregunta]];
printf (%s%17s\n,Rating, Frecuencia);
Rating Frecuencia
1 2
2 2
3 2
4 2
5 5
6 11
7 5
8 7
9 1
10 3
int Temperaturas[24];
Pag 24
Estructura de datos
arreglo. Dado que ha sido pasada la direccin inicial del arreglo, la funcin
llamada sabe precisamente dnde est el arreglo almacenado. Por lo tanto,
cuando en su cuerpo de funcin, la funcin llamada modifica los elementos del
arreglo, est modificando los elementos reales del arreglo, en sus
localizaciones de memoria originales.
#include <stdio.h>
main()
{
char array[5];
printf ( array = %p\n&array[0] = %p\n, array, &array[0]);
return 0;
}
array = FFF0
&array = FFF0
Arreglos multidimensionales
Aunque los elementos de los arreglos se almacenan en forma contigua, con
frecuencia resulta til imaginar que un arreglo bidimensional es un conjunto
rectangular de elementos con filas y columnas. Por ejemplo si se declara:
Puede imaginarse que los elementos del arreglo estn ordenados de la manera
siguiente:
Col 1 Col 2 Col 3 Col 4 Col 5
Fila 1 B[0] [0] B[0] [1] B[0] [2] B[0] [3] B[0] [4]
Fila 2 B[1] [0] B[1] [1] B[1] [2] B[1] [3] B[1] [4]
Fila 3 B[2] [0] B[2] [1] B[2} [2] B[2] [3] B[2] [4]
t[x,y];
y no
t[x] [y];
Pag 25
Estructura de datos
int a[4][4];
for (column = 0;column 3; column++)
A[2] [column] =0
Especificamos el tercer rengln, por lo tanto, sabemos que el primer subndice
ser siempre 2 (o es el primer rengln y 1 el segndo). El ciclo for vara slo
en el segundo subndice (es decir, el subndice de columnas). La estructura for
anterior es equivalente a los enunciados de asignacin siguientes:
a[2][0] = 0;
a[2][1] = 0;
a[2][2] = 0;
a[2][3] = 0;
Total = 0;
for (renglon =0; renglon <=3; renglon++)
for (column = 0;column <=3; column++)
total +=[renglon] [column];
Cadenas
Una cadena es una secuencia de caracteres encerrada entre comillas .
Obsrvese que el smbolo es un solo carcter, no dos. Si el carcter ha de
aparecer en una cadena, debe ir precedido del carcter \. A continuacin se
presentan varios ejemplos de cadenas.
Las cadenas son arreglos unidimensionales de tipo char que tinen varas
caractersticas nicas. Un arreglo de caracteres puede ser inicializado utilizando
una literal de cadena. Por ejemplo, la declaracin
Pag 26
Estructura de datos
char string2[20];
Crea un arreglo de caracteres capaz de almacenar una cadena de 19
caracteres y un carcter nulo de terminacin. El enunciado
La funcin scanf lee caracteres del teclado hasta que se encuentra con el
primer carcter de espacio en blanco sin impotarle que tan grande es el
arreglo. Por lo tanto, scanf podra escribir ms all del final del arreglo.
#include <stdio.h>
main()
{
char string1[20], string2[] = string literal;
int i;
printf(Mete un string: );
Pag 27
Estructura de datos
scanf(%s,string1);
printf(string1 es: %s\nstring2 es %s\n
string1 con espacios entre caracteres es: \n,
string1, string2);
for (i = 0; string1[i] != \0; I++)
printf(%c , string1[i]);
printf(\n);
return 0;
}
Uniones
Una union es un tipo de datos derivado como lo es una estructura- cuyos
miembros comparten el mismo espacio de almacenamiento. Para distintas
situaciones en un programa, algunas variables pudieran no ser de importancia,
pero otras variables lo son por lo que una union comparte el espcacio, en vez
de desperdiciar almacenamiento en variables que no esten siendo utilizadas.
Los miembros de la union pueden ser de cualquier tipo el nmero de bytes
utilizados para almacenar una unin, deben ser por lo menos suficientes para
contener al miembro mas grande. En la mayor parte de casos las uniones
contienen dos o ms tipos de datos. Unicamente un miembro y, por lo tanto,
nicamente un tipo de datos, puede ser referenciado en un momento dado
union number{
int x;
float y;
}
indica que number es un tipo union con miembros int x y float. En un
programa normalmente la definicin de unin antecede a main, por lo que esta
puede ser utilizada para declarar variables en todo el programa.
Las operaciones que pueden ser ejecutadas en una unin son: asignar una
unin a otra unin del mismo tipo, tomar la direccin (&) de una unin, y tener
acceso a los miembros de una union utilizando el operador de miembro de
estructura y el operador de apuntador de estructura.
En una declaracin, una union puede ser inicializada nicamente con un valor
del mismo tipo que el primer miembro de la union. Por ejemplo, en la union
anterior, la declaracin
Pag 28
Estructura de datos
Constantes de enumeracin
C proporciona un tipo final, definido por el usuario, conocido como una
enumeracin. Una enumeracin, introducida por la palabra reservada enum,
es un conjunto de constantes enteras representadas por identificadores. Estas
constantes de enumeracin son, en efecto, constantes simblicas, cuyos
valores pueden ser definidos automticamente. Los valores de un enum se
inician con 0, a menos de que se defina de otra manera, y se incrementan en
1. Por ejemplo
enum months {JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT,
NOV, DEC};
crea un nuevo tipo en enum months, en el cual los identificadores son
definidos automticamente a los enteros 0 a 11. Para numerar los meses 1 a
12, utilice la enumeracin siguiente
enum monts {JAN =1, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT,
NOV,
DEC};
Dado que el primer valor de la enumeracin se define explcitamente en 1, los
valores subsiguientes se incrementan en 1dando como resultado los valores
1hasta 12
Los identificadores en una enumeracin deben de ser unicos. En una
enumeracin el valor de cada constante en la enumeracin puede ser
establecido explcitamente en la definicin, mediante la asignacin de un valor
al identificador. Varios miembros pueden tener el mismo valor entero.
#include <stdio.h>
enum months {JAN = 1, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV,
DEC};
main ()
{
enum months month;
char *monthName[] = {, January,February,March,April,May,
June,July,August, September, October,November,
December};
Pag 29
Estructura de datos
return 0
}
1 January
2 February
3 March
4 Apr
5 May
6 June
7 July
8 Aug
9 Sep
10 Oct
11 Nov
12 Dec
Apuntadores
Los apuntadores le permiten a los programas simular llamadas por referencia,
crear y manipular estructuras de datos es decir, estructuras de datos que
pueden crecer o encongerse como son listas enlazadas, colas de espera, pilas y
rboles.
Los apuntadores son variables que contienen direcciones de memoria como sus
valores. Por lo regular una variable contiene directamente un valor especifico,
un apuntador por otra parte, contiene la direccin de una variable que contiene
un valor especifico. En este sentido un nombre de variable se refiere
directamente a un valor y un apuntador se refiere indirectamente a un valor, el
referirse a un valor a travs de un apuntador se conoce como indireccin.
Los apuntadores como cualquier otra variable deben ser declarados antes de
que puedan ser utilizados.
Pag 30
Estructura de datos
contador
7
contadorAptr contador
7 ContadorAptr se
refiere en forma
indirecta a la
variable cuyo valor
es 7
Operadores de apuntador
El &, u operador de direccin, es un operador unario que regresa la direccin
de su operando. Por ejemplo, suponiendo las declaraciones
int y= 5;
int *yPtr;
el enunciado
yPtr = &y;
asigna la direccin de la variable y a la variable de apuntador yPtr. La variable
yPtr se dice que apunta a
yPtr
Pag 31
Estructura de datos
yPtr y
500000 600000 600000 5
#include <stdio.h>
CuboPorReferencia(int *);
main()
{
int numero = 5;
Pag 32
Estructura de datos
bPtr = b;
Este enunciado es equivalente a tomar la direccin del primer elemento del
arreglo, como sigue
bPtr = &b[0]
Alternativamente el elemento del arreglo b[3] puede ser referenciado con la
expresin de apuntador
*(bPtr + 3)
El 3 en la expresin arriba citada es el desplazamiento del apuntador. Cuando
el apuntador apunta al principio del arreglo, el desplazamiento indica que el
elemento del arreglo debe ser referenciado, y el valor del desplazamiento es
idntico al subndice del arreglo, la notacin anterior se conoce como notacin
apuntador/desplazamiento.Al igual que el elemento del arreglo puede ser
referenciado con una expresin de apuntador, la direccin
&[3]
puede ser escrita con la expresin de apuntador
bPtr + 3
El arreglo mismo puede ser tratado como un apuntador, y utilizado en
aritmtica de un apuntador.
Por ejemplo la expresin
*(b + 3)
tambin se refiere al elemento del arreglo b[3]. En general, todas las
expresiones de arreglos son subndice pueden ser escritas mediante un
apuntador y un desplazamiento.
Arreglos de apuntadores
Los arreglos pueden contener apuntadores. Un uso comn para una estructura
de datos como sta, es formar un arreglo de cadenas. Cada entrada del arreglo
es una cadena pero en C una cadena es esencial un apuntador a su primer
carcter. Por lo que en un arreglo de cadenas cada entrada es de hecho un
apuntador al primer carcter.
Pag 33
Estructura de datos
largo que el nmero de caracteres entre las comillas. En el arreglo suit parece
que estan colocadas estas cadenas pero en el arreglo solo estn almacenados
los apuntadores.
Suit[0] C o r a z o n e s \0
Suit[1]
D i a m a n t e s \0
Suit[2]
Suit[3]
T r e b o l e s \0
E s p a d a s \0
memoria por lo general se lleva a cabo con las funciones estandar de biblioteca
malloc y free. Considere la declaracin
TypeName *ptr;
Donde typeName es cualquier tipo (como int, float, char, etctera). En ANSI C,
el enunciado siguiente asigna en forma dinmica un objeto typeName, regresa
un apuntador void al objeto, y asigna dicho apuntador a ptr
En C++, el enunciado
Pag 34
Estructura de datos
delete ptr
En C, se invoca la funcin free con el argumento ptr, a fin de desasignar
memoria. El operador delete slo puede ser utilizado para desasignar memoria
ya asignada por new. Aplicar delete a un apuntador previamente desasignado
puede llevar a errores, inesperados durante la ejecucin del programa. Aplicar
delete a un apuntador nulo no tiene efecto en la ejecucin del programa.
int *arrayPtr;
ArrayPtr = new int[100]; //creando arreglo dinmico
delete [] arrayPtr;
Ordenamiento
La ordenacin o clasificacin de datos (sort) es una operacin consistente en
disponer un conjunto estructura- de datos, en algn determinado orden con
respecto a uno de los campos elementos del conjunto. Los elementos
numricos se pueden ordenar en orden creciente o decreciente de acuerdo al
valor numrico del elemento. En terminologa de ordenacin, el elemento por
el cual esta ordenado un conjunto de datos se denomina clave.
Pag 35
Estructura de datos
Este mtodo es clsico y muy sencillo, aunque por desgracia poco eficiente. La
ordenacin por burbuja se basa en la comparacin de elementos adyacentes
de la lista (vector) e intercambiar sus valores si estn desordenados. De este
modo se dice que los valores ms pequeos burbujean hacia la parte superior
de la lista, mientras que los valores ms grandes se hunden haca el fondo de
la lista.
A[1] 23 15
A[2] 19 19
A[3] 45 23
A[4] 31 31
Pag 36
Estructura de datos
A[5] 15 44
Lista sin ordenar Lista ordenada
Pasada 1: i=1
A[1] 23 19 19 19 19
A[2] 19 23 23 23 23
A[3] 45 45 45 31 31
A[4] 31 31 31 45 15 elemento
ordenado
A[5] 15 15 15 15 45
j=1 j=2 j=3 j=4
Pasada 2: i = 2
A[1] 19 19 19 19 19
A[2] 23 23 23 23 23
A[3] 31 31 31 15 15
elemento
A[4] 15 15 15 31 31 ordenado
A[5] 45 45 45 45 45
J=1 j=2 j=3 j=4
Pasada 3: i = 3
Pag 37
Estructura de datos
A[1] 19 19 19 19 19
A[2] 23 23 15 15 15
A[3] 15 15 23 23 23
elemento
A[4] 31 31 31 31 31 ordenado
A[5] 45 45 45 45 45
j=1 j=2 j=3 j=4
Pasada 4: i =4
A[1] 19 15 15 15 15
A[2] 15 19 19 19 19
A[3] 23 23 23 23 23
elemento
A[4] 31 31 31 31 31 ordenado
A[5] 45 45 45 45 45
j=1 j=2 j=3 j=4 j=5
Se observa que se necesitan cuatro pasadas para ordenar una lista de nmeros
de cinco elementos, por lo que una lista de n elementos necesitar n-1
pasadas.
El nmero de pasadas se puede controlar con un bucle for y cada secuencia de
comparaciones se puede controlar con un bucle for anidado al bucle de
pasadas, en el que j vara desde 1 hasta 5 menos el valor especifico de i.
Algoritmo (Pseudocdigo)
Pag 38
Estructura de datos
int i, j,aux;
Burbuja mejorado
El algoritmo burbuja se puede mejorar si disponemos de algn tipo de
indicador que registre si se han producido intercambios en la pasada. Cuando
se explor la lista y el indicador no refleje intercambios, la lista estar ya
ocupada y se terminarn las comparaciones.
i =1
Repetir
NoIntercambio = true
Desde j = i hasta n i hacer
Si A[j] > A[J+1]
Entonces Intercambio (A[j], A[j+1])
NoIntercambio = false
Fin si
Fin_desde
i = i+1
Hasta que NoIntercambio = true
Pag 39
Estructura de datos
j++;
}
Tres cartas 2 6 10
Cuatro 2 6 //////// 10
cartas 9 ////////
Cinco 2 6 //////// 9 10
cartas 7 ////////
1 4 6 10 15
Algoritmo
Fin_desde
Pag 40
Estructura de datos
Algoritmo de desplazamiento
Mientras el primer elemento no se desplaza y el valor del elemento >
Aux hacer
o Desplazar elemento una posicin.
o Comprobar valor del siguiente elemento.
o Definir NuevaPos como posicin original del ltimo elemento
desplazado.
Fin_mientras
for(k=2;k<=n;k++){
aux = lista[k]; /*obtener siguiente elemento a insertar*/
Lista[nueva_pos(Lista,k,aux)]=aux; /*insertar aux en posicin
nueva*/
}
return 0;
}
Pag 41
Estructura de datos
Lista A[1] 5 5 5 -2
desordenada
A[2] 14 2 2 2
A[3] -2 -2 -2 5
A[4] 10 10 10 10
A[5] 2 14 14 14
Pag 42
Estructura de datos
Ordenamiento Shell
La ordenacin Shell debe el nombre a su inventor, D. L. Shell. Se suele
denominar tambin ordenacin por disminucin de incremento (gap). La idea
general del mtodo (algoritmo) es la siguiente:
Lista original
504 88 513 62 908 171 898 277 654 427 150 510 612
675 750 704
Pag 43
Estructura de datos
504 88 513 62 908 171 898 277 654 427 150 510
Pag 44
Estructura de datos
504 88 150 62 612 171 760 277 654 427 513 510
Pag 45
Estructura de datos
504 88 150 62 612 171 513 277 654 427 760 510
154 62 504 88 513 171 612 277 654 427 760 510
62 88 154 171 277 427 504 510 513 612 654 675
704 760 898 908
Algoritmo
Intervalo = n div 2
Mientras (intervalo > 0 ) hacer
Desde i = (intervalo + 1) hasta n hacer
J = i intervalo
Mientras (j >0 ) hacer
K = j + intervalo
Si ( a [j] <= a[k])
Entonces
J=0
Si no
Intercambio (a[j], a[k]
Fin si
j = j intervalo
Fin mientras
Fin desde
Intervalo = intervalo div 2
Fin mientras
Cdigo
Pag 46
Estructura de datos
Aux = X;
X = Y;
Y =Aux;
}
Pag 47
Estructura de datos
Ejemplo:
Mezclar las dos listas de nmeros a y b.
2 4 78 97 lista A
-15 0 13 15 78 90 96 lista B
2 4 78 97 Lista A
j se ha incrementado
i junto con k
<
Lista C
Lista B
k -15 0 13 15 78 90 94 96
-15 0 Lista C
Comparar A[i]
Y B[j]. Poner el
Ms pequeo en
C[k]. Incrementar
Los indices apropiados
Pag 48
EstructuraLista
de datos
A
2 4 78 97
i
<
Lista B
k -15 0 13 15 78 90 94 96
-15
B < A[j], de modo que C[k] se obtiene de B[j]
Procedimiento mezcla de los vectores A y B
void Mezcla (int A[],int B[],int C[],int M,int N ){
int I, J, K ; /*A Y B : entrada. Vectores ya ordenados*/
I=J=K=1; /*M Y N: nmero de elementos de A y B
respectivamente*/
while ((I <= M) &&(J <= N)) { /*C : salida. Vector mezcla ordenado*/
if (A[I] <= B[J]){ /*El tipo Lista, tendr una longitud minima
de M + N elementos*/
C [K] = A[I];
I++;
}
else
{
C [K] = B[J];
J ++;
}
K++;
}
{copiar el resto del vector no agotado}
if (I > M)
for( P=J;P<=N;P++){
C [K] = B [P];
K++;
}
else
for( P=I;P< M;P++){
C [K] = A [P];
K++;
}
return 0;
}
Pag 49
Estructura de datos
Bsquedas
Bsqueda secuencial
Un problema importante en el proceso de datos, como ya se ha comentado, es
la bsqueda en un conjunto de datos de un elemento especifico y la
recuperacin de alguna informacin asociada al mismo.
A[1} 451871
A [2] 120467
A [3] 401321
A[4] 25761
- - Elemento a buscar: t
- - 453714
- -
A[98] 339412
A[99] 81467
A[100] 924116
Nmeros Seguridad Social
Pseudocdigo 1
Posicin = 0
{lista = vector a[i] de n elementos}
desde i = 1 hasta n hacer
si a[i] = t
entonces Posicin = i
fin si
fin desde
Pag 50
Estructura de datos
Pseudocdigo 2
Encontrado = falso
Posicin = 0
i=1
mientras (i <= n) y (No Encontrado=verdadero) hacer
si a[i] = t
entonces Posicin = i
Encontrado = verdadero
Fin si
i=i+1
fin_mientras
int Encontrado=0,I=1,Posicion;
Bsqueda Binaria
La bsqueda lineal, por sus simplicidad es buena para listas de datos pequeas
para listas grandes es ineficiente, la bsqueda binaria es el mtodo idneo. Se
basa en el conocido mtodo divide y vencers.
Pag 51
Estructura de datos
1331
1373
1555
1850
1892
1898 Elemento central
1989
Elemento buscado
2002
2400
2670
3200
Y que se busca el nmero 1989
Se examina en primer lugar el elemento central de la lista (las divisiones se
toman iguales) 1898. Dado que 1989 es mayor que 1898, el elemento a buscar
estar en la segunda mitad. Por consiguiente, se sigue la bsqueda en esta
mitad:
Pag 52
Estructura de datos
Algoritmo
1. Establecer Primero = 1 y Ultimo = n (n, nmero de elementos). Estas
variables representan la primera y ltima posicin de la lista o sublista
donde se est buscando y permite el calculo de la posicin del elemento
central.
2. Encontrado = falso .
3. mientras Primero <= Ultimo y Encontrado = falso hacer
{Encontrar posicin central}
Central = (Primero + Ultimo) div 2
{Comparar elemento buscado t con A[Central]}
si t = a [Central]
entonces Encontrado = verdadero
sino si t > A [Central]
entonces Primero = Central + 1
sino Ultimo = Central 1
fin mientras
4. si Encontrado = verdadero
entonces Posicin = Central {existe elemento}
si no Posicin = 0 {no se ha encontrado}
fin_si
La bsqueda binaria requiere una ordenacin previa del vector o lista en el que
se va ha efectuar la bsqueda. Por consiguiente, las acciones tpicas (mdulos)
en un algoritmo de bsqueda binaria son:
Pag 53
Estructura de datos
return 0;
else
return Central;
}
Las estructuras de datos estticas son aquellas en las que se asigna una
cantidad fija de memoria cuando se declara la variable, en numerosas
ocasiones se necesitan, colecciones de datos que crezcan y reduzcan su
tamao en memoria a medida que el programa progresa, a estas estructuras
de datos cuya ocupacin en memoria puede aumentar o disminuir en tiempo
de ejecucin se denominan estructuras dinmicas de datos.
Pag 54
Estructura de datos
Estructuras
Las estructuras son colecciones de variables relacionadas a veces
denominados agregados bajo un nombre. Las estructuras pueden contener
variables de muchos tipos diferentes de datos a diferencia de los arreglos, que
contienen unicamente elemento de un mismo tipo de datos. Generalmente las
estructuras se utilizan para definir registros a almacenar en archivos.
Creacin de estructuras
Crear una estructura es definir un nuevo tipo de datos, denominado tipo
estructura y declarar una variable de este tipo. En la definicin del tipo
estructura, y declarar una variable de este tipo. En la definicin del tipo
estructura, se especifican los elementos que la componen as como sus tipos.
Cada elemento de la estructura recibe el nombre de miembro (campo del
registro). La sntaxis es la siguiente:
struct tipo_estructura
{
declaraciones de los miembros
};
variable.miembro
Ejemplo:
Pag 55
Estructura de datos
char nombre[40];
char direccin[40];
long telefono;
};
Este ejemplo define las variables var1 y var2, de tipo ficha, por lo que cada
una de las variables consta de los miembros: nombre, direccin y telfono.
Ejemplo:
struct ficha
{
char nombre[40];
char direccion[40];
long telefono;
} var1, var2;
struct card {
char false[10];
char suit[10];
}a, deck[52];
Pag 56
Estructura de datos
typedef
La palabra reservada typedef proporciona un mecanismo para la creacin de
sinnimos (o alias)para tipos de datos anteriormente definidos
typedef struct{
char false[10];
char suit[10];
}Card;
Pag 57
Estructura de datos
Card puede ser utilizado para declarar variables de tipo struct card. La
declaracin
Card deck[52];
Al crear un nuevo nombre utilizando typedef no se crea un nuevo tipo; typedef
simplemente crea un nuevo nombre de tipo que puede ser utilizado como un
seudnimo para un nombre de tipo existente.
Ejemplo:
Pag 58
Estructura de datos
#include <stdio.h>
#include <stdlib.h>
#define NA 10
main()
{
struct ficha
{
char nombre[60];
float nota;
};
/*Entrada de datos*/
printf(Finalizar la entrada con cont/Z\n\n);
printf(Nombre);
fin = gets(alumnos[n].nombre);
for (i =0;i<n>i++)
if (alumnos[i].nota >=5)
aprobados ++;
else
suspensos ++;
printf(Aprobados %.2g %%\n,aprobados /n*100);
printf(Suspensos %.2g %% \n,suspensos/n*100);
}
Pag 59
Estructura de datos
T.D.A. Lista
Modelo Matemtico
Las listas constituyen una estructura flexible en particular, por que pueden
crecer y acortarse segn se requiera, los elementos son accesibles y se pueden
insertar y suprimir en cualquier posicin de la lista, las listas tambin pueden
concatenarse entre si o dividirse en sublistas; se representan de manera
rutinara en aplicaciones como manera de aplicacin.
Una propiedad importante de una lista es que sus elementos pueden estar
ordenados en forma lineal de acuerdo con sus posiciones en la misma. Se dice
que ai precede a ai+1 para i = 1, 2,...n-1 y que ai sucede a ai-1 para i = 2,
3,...n. Se dice que el elemento ai est en la posicin i. Es conveniente postular
tambin la existencia de una posicin que sucede al ltimo elemento de la
lista. La funcin FIN(L) devolver la posicin que sigue a la posicin que sigue
a la posicin n en una lista L de n elementos. Observese que la posicin FIN(L),
con respecto al principio de la lista, est en una distancia que vara conforme
la lista crece o se reduce, mientras que las demas posiciones guardan una
distancia fija con respecto al principio de la lista.
Operaciones
Se representar ahora un conjunto representativo de operaciones con listas.
Ah, L es una lista de objetos de tipo tipo_elemento, x es un objeto de ese tipo
y p es de tipo posicin. Observese que <<posicin>> es otro tipo de datos
cuya implantacin cambiar con aquella que se haya elegido para las listas.
Aunque de manera informal se piensa en las posiciones como enteros, en la
practica pueden tener otra representacin.
Pag 60
Estructura de datos
Pag 61
Estructura de datos
1 primer elemento
2 segundo elemento
lista
lt ltimo elemento
vaco
Long_mx
En la realizacin con arreglos se define el tipo LISTA como un registro con dos
campos, el primero es un arreglo de elementos que tiene la longitud adecuada
para contener la lista de mayor tamao que se puede representar. El segundo
campo es un entero lt que indica la posicin del ltimo elemento de la lista en
el arreglo. El i-simo elemento de la lista est en la i-sima posicin, mediante
el entero i. La funcin FIN(L) slo tiene que devolver lt +1. Las declaraciones
importantes son:
#include <stdio.h>
#include <conio.h>
# define TAM 10
# define TRUE 1
# define FALSE 0
struct LISTA
{
dato elem[TAM];
posicion ult;
};
Pag 62
Estructura de datos
Pag 63
Estructura de datos
return (--p);
}
Pag 64
Estructura de datos
for(i=0;i<9;i++)
{
printf("Dame el numero");
scanf("%d",&x);
Insertar(x,Primero(L),L);
Pag 65
Estructura de datos
}
Imprime(L);
printf("La posicion el numero");
scanf("%d",&p);
Suprimir(p,L);
clrscr();
Imprime(L);
x=Recupera(1,L);
printf("%d",x);
x=Anterior(3,L);
printf("%d",x);
x=Siguiente(5,L);
printf("%d",x);
getch();
}
Una ventaja es que como es bien sabido, los arreglos son estructuras de
acceso directo, por lo que las dems operaciones son triviales, as que una
representacin con arreglos en un momento dado pudiera ser de utilidad.
Pag 66
Estructura de datos
Para representar una Pila con arreglos es posible hacerlo de manera similar
como se hizo con las Listas con arreglos, establecemos la Pila como un registro
don dos campos, el primero un arreglo para contener los datos de la Pila y un
campo para almacenar la posicin del elemento superior de la pila (que en lo
sucesivo llamaremos tope).
#define TAM 38
typedef char tipo_elem;
typedef int logico;
struct Pila{
Tipo_elem elemento[TAM];
Int tope;
};
1
2
3
4
.
tope .
.
TAM
Pag 67
Estructura de datos
Notacin Polaca
Las expresiones se componen de operandos, operadores y delimitadores. Los
operandos son valores numricos que se utilizan para calcular la expresin. Los
operadores indican las operaciones matemticas que van hacerse sobre los
operandos respectivos. Tambin determinan la cantidad de operandos
necesarios para cada tipo de operacin (binarios y unarios).
Es evidente que el orden en que se calculan las operaciones puede ser muy
importante, como en la expresin 6 + 4/2. Si la resolvemos como (6+4)/2, la
respuesta es 5, si lo hacemos como 6 + (4/2), el resultado es 8.
Pag 68
Estructura de datos
Operador Valor
3
x,/ 2
+,- 1
A + B (infija)
A B + (posfija o polaca)
La segunda forma con el operador despus del operando se conoce como
notacin posfija (polaca).
a + (bXc)
a + (bcX)
Los dos operandos del operador X son b y c, por lo que es fcil determinar la
posicin posfija de ese signo, pero cuales son los dos operandos del operador
+?, la respuesta es a y el resultado de la subexpresin (bXc). Y ponemos el
operador + despus del parentisis de cierre:
Pag 69
Estructura de datos
a(bcX)+
El paso final es quitar el parntesis
abcX+
Ahora, usando parntesis, vamos a cambiar el orden del clculo de los
operandos y a convertir la expresin (a + b) X c en notacin polaca:
(a + b) X c expresin infija
(a + b) X c se aaden parntesis sin cambio
(ab +)X c se convirti el +
(ab +) c X se convirti el X
ab + c X se elimin el parntesis
Recursividad
Un subprograma (procedimiento o funcin) recursivo es aquel que se llama as
mismo. La recursividad es una alternativa a la iteracin o repeticin, y aunque
en tiempo de computadora y en ocupacin de memoria es la solucin recursiva
menos eficiente que la solucin iterativa, existen numerosas situaciones en las
que la recursividad es una solucin simple y natural a un problema que en caso
contrario sera difcil de resolver.
Pag 70
Estructura de datos
9 23 31 17 21 19 13 15 26
9 23 31 17 // 19 13 15 26
21//
pivote
2. A continuacin se establecen dos punteros en la lista I o J. El primer
puntero apunta al primer elemento. Por consiguiente, I =1. El segundo
puntero apunta al ltimo elemento y, por lo tanto, J=9 (noveno
elemento).
9 23 31 17 // 19 13 15 26
21//
I= 1 J=9
Pag 71
Estructura de datos
9 23 31 17 // 19 13 15 26
21//
I J
4. Se intercambian los elementos apuntados por I y J y a
continucacin se incrementan en uno los contadores I, J.
9 15 31 17 // 19 13 23 26
21//
I J
5. El proceso se repite
9 15 13 17 // 19 31 23 26
21//
I J
9 15 13 17 // 19 31 23 26
21//
I J
9 15 13 17 // 21 31 23 26
19//
J I
Pag 72
Estructura de datos
9 15 13 17 19 21 31 23 26
I J I J
9 15 13 17 19 21 31 23 26
I J I J
9 15 13 17 19 21 23 31 26
I J J I
9 13 15 17 19 31 26
J I I J
9 13 15 17 19 31 26
J I J I
9 13 15 17 19
9 13 15 17 19
Lista Ordenada
Pag 73
Estructura de datos
9 13 15 17 // 21 23 26 31
19//
typedef
int enteros;
enteros Lista[]
Pag 74
Estructura de datos
Torres de Hanoi
Pag 75
Estructura de datos
Anlisis
El problema a primera vista parece sencillo, pero su solucin es francamente
difcil y slo la solucin recursiva facilita la resolucin. Tres, cuatro discos son
imaginables, 64 (las leyendas citan esta cifra como la propuesta de un rey
tibetano a sus subditos, al estilo del tambin famoso problema del tiempo
necesario para llenar un tablero de ajedrez en progresin geomtrica) es
prcticamente inimaginable y casi imposible, sin solucin recursiva.
Algoritmo (3 discos)
Algoritmo (n discos)
Mover n-1 discos desde 1 hasta el 2 utilizando el poste 3.
Mover el disco restante desde 1 hasta el 3.
Mover la torre de n-1 discos desde el poste 3 utilizando el poste 1.
Situacin
inicial
Pag 76
Estructura de datos
Pos NumDiscos;
main(){
printf (Introduzca nmero de discos en juego\n);
scanf(%d,&NumDiscos);
printf(Para %d discos, NumDiscos);
printf (Los movimientos sucesivos son :\n);
MoverTorre(NumDiscos, 1, 2, 3);
}
H(1) =1
H(n) = 1 + 2 H(n-1) (n>1)
Pag 77
Estructura de datos
Para una torre de 4 discos los movimientos son 15 y para una torre de 64
discos los movimientos son inimaginables 2 E(64) 1.
Colas
Una cola es otro tipo especial de lista en el cual los elementos se insertan en
un extremo (el posterior ) y se suprimen en el otro (el anterior o frente). Las
colas se conocen tambin como listas <<FIFO>> (first-in, first out) o listas
<<primero en entrar, primero en salir>>. Las operaciones para una cola son
anlogas a las de las pilas, las diferencias sustanciales consisten en que las
inserciones se hacen al final de la lista, y no al principio, y en que la
terminologa tradicional para colas y listas no es la misma. Se usarn las
siguientes operaciones con colas.
Operaciones
#define TAM 20
#define TRUE 1
#define FALSO 0
typedef int tipo_elem,logico;
typedef struct{
Tipo_elem elemento [TAM];
Int final, frente;
}Cola;
Pag 78
Estructura de datos
Final Frente
Pag 79
Estructura de datos
else
C.final++;
c.elem[C.final]=x;
}
}
Concepto de apuntador
Estructuras autoreferenciadas
Una estructura autoreferenciada contiene un miembro de apuntador que
apunta a una estructura del mismo tipo de estructura. Por ejemplo, la
definicin
struct nodo {
int dato;
struct nodo *proxPtr;
};
Define un tipo struct nodo. Una estructura del tipo struct nodo tiene dos
miembros el miembro entero dato y el miembro de apuntador proxPtr. El
miembro nextPtr apunga a una estructura de tipo struct nodo Una estructura
Pag 80
Estructura de datos
15 10
#define TAM 10
typedef int Tipo_elem;
struct ESPACIO{
Tipo_elem Elemento;
int sig;
}Lista[TAM];
int dis,Prim;
Para la realizacin de este tipo de listas nos podemos auxiliar de una variable
llamada Disponible, que nos da la posicin del arreglo del primer disponible o
vaca y en el caso de saber donde inicia la lista hacemos uso de una variable
entera que llamaremos Primero.
Pag 81
Estructura de datos
ESPACIO
1 D 8
2 4
Prim 3 C 1
4 6
5 A 9
6 7
7 0
8 E 5
9 B 0
Disponible 10 10
11 2
Elemento sig
Pag 82
Estructura de datos
En esta representacin, una lista est formada por celdas; cada celda contiene
un elemento de la lista y un apuntador a la siguiente celda. Si la lista a1, a2,
a3,...,an, la celda que contiene ai tiene un apuntador a la celda que contiene a
ai+1, para i=1,2,...,n 1. La celda que contiene an posee un apuntador a
NULL. Existe tambin una celda de encabezamiento que apunta a la celda que
contiene a1; esta celda de encabezamiento no tiene ningn elemento. En este
caso hablamos de una lista simplemente ligada con nodo de encabezamiento
vaco, en la que el empleo de una celda completa para el encabezado simplifica
la implementacin de las operaciones para manipular la lista, aunque tambin
se puede utilizar el encabezado para almacenar el primer elemento y a este
tipo de representacin se le conoce como lista simplemente ligada con nodo de
encabezamiento no vaco, en la que las inserciones y supresiones al principio
de la lista se manejan de manera especial.
A1 A2 An
encabezado Lista
typedef tipo_elemento:
struct nodo{
tipo_elemento elemento;
nodo *sig;
}
Pag 83
Estructura de datos
encabezado
A1 A2 An
encabezado p x
aux
A1 x A2 An
encabezado p aux
Pag 84
Estructura de datos
A1 A2 An
Pag 85
encabezado Lista
Estructura de datos
encabezado
Pag 86
Estructura de datos
Pag 87
Estructura de datos
Aun cuando una Lista Circular tiene ventajas sobre una Lista Lineal, sta
todava tiene algunas deficiencias, uno no puede recorrer esta lista en direccin
contraria, ni tampoco se puede eliminar un nodo de una lista simplemente
ligada circular simplemente un apuntador a ese nodo. En el caso de que se
requieran tener estas flexibilidades la estructura de datos para representar una
lista con apuntadores es la lista doblemente ligada.
La estructura de datos para representar este tipo de Lista sera un nodo com
un registro con tres campos, uno para almacenar al elemento de la lista, y dos
para almacenar las direcciones de los nodos siguiente y anterior a uno dado.
Pag 88
Estructura de datos
Encabezado
nil
Pag 89
Estructura de datos
Pag 90
Estructura de datos
Nodo Aux;
Aux =p;
if (VACIA(p))
printf (Error, Lista Vaca\n);
else
while (!VACIA(p)) {
printf(%d,RECUPERA(p));
p=p->sig;
}
}
Encabezado
Pag 91
Estructura de datos
Pag 92
Estructura de datos
else
return -1;
}
Pag 93
Estructura de datos
nuevo = new(nodo);
nuevo->tipo_elemento:=x;
nuevo->sig = aux;
L->sig =Nuevo;
}
}
Pag 94
Estructura de datos
return L==NULL;
}
Pag 95
Estructura de datos
aux = new(Nodo);
aux->elemento=x;
aux->sig:=P->sig;
P ->sig = aux;
}
struct Cola{
Nodo Fondo,Frente;
}
Pag 96
Estructura de datos
else
return 0;
}
Pag 97
Estructura de datos
rboles binarios
rbol Binario
Un rbol binario es un conjunto finito de elementos que puede estar vaco o
contener un elemento denominado la raiz del rbol, esta raz contiene cuando
mucho un subrbol izquierdo y ubrbol derecho; los cuales a su vez tambin
son rboles binarios. A cada elemento de un rbol binario se le denomina Nodo
del rbol.
1. Un nodo es, por si mismo, un rbol. Ese nodo es tambin la raz de dicho
rbol.
2. Supongamos que n es un nodo y que A1, A2,...Ak son rboles con races
n1,n2,...nk, respectivamente. Se puede construir un nuevo rbol
haciendo que n se convierta en el padre de los nodos n1,n2,..., nk. En
dicho rbol, n es la ras y A1,A2,..,Ak son los subrboles de la raz. Los
nodos n1,n2,....nk reciben el nombre de hijos del nodo n.
raz
Subrbol izquierdo
Subrbol
derecho
Pag 98
Estructura de datos
Representacin ligada
typedef int tipo_elemento;
struct nodo{
Tipo_elemento Info;
Nodo *Izq, *Der
}
Pag 99
Estructura de datos
P=Raiz;
if ((P==NULL) || (x=P->Info))
return P;
else
if (x<P->Info)
return BUSCAR(x,P->Izq);
else
return BUSCAR(x,P->Der);
}
Representaciones secuenciales
Una forma conveniente de estructurar datos para representar un rbol binario
consiste en dar a sus nodos los nombres 1, 2, ...,n y utilizar un arreglo de
registros declarado como:
Struct Nodo{
int Hijo_izq;
int Hijo_der;
}Espacio_celdas[TAM_NODOS];
Pag 100
Estructura de datos
void PREORDEN(Nodo R)
if (R!=NULL){
printf(%d,R->info); //Visitamos la raz
PREORDEN(R->izq); //Recorremos el subrbol izquierdo
PREORDEN(R->der); //Recorremos el subrbol derecho
}
}
Pag 101
Estructura de datos
Grafos
Grafo dirigido
Un grafo dirigido G consiste en un conjunto de vrtices V y un conjunto de
arcos A. Los vrtices se denominan tambin nodos o puntos; los arcos pueden
llamarse arcos dirigidos o lineas dirigidas. Un arco es un par ordenado de
vrtces (v, w); y es la cola y w la cabeza del arco. El arco (v, w) se expresa a
menudo como v w va de v a w, y que w es adyacente a v.
Los vrtices de un grafo dirido pueden usarse para representar objetos, y los
arcos relacionados ente los objetos. Por ejemplo, los vrtices pueden
representar ciudades y los arcos, vuelos areos de de una ciudad a otra. Un
grafo dirigo puede emplearse para representar el flujo de control en un
programa de computador. Los vrtces representan bloques bsicos, y los arcos
posibles tranasferencias del flujo de control.
Un camino en un grafo dirigo es una secuencia de vrtices v1, v2, ...vn, tal que
v1v2, v2v3,.....vn-1vn.son arcos. Este camino va del vrtices v1 al vrtice
vn, pasa por los vrtices v2, v3,...vn-1 y termina en el vrtice vn. La longitud
de un camino es el nmero de arcos en ese camino, en este caso n-1. Como
caso especial, un vrtice sencillo, v, por si mismo denota un camino de
longitud cero de v a v. En la figura la secuencia 1, 2, 4, es un camino de
longitud 2 que va del vrtice 1 al vrtice 4.
1 2
3 4
Grafo dirigido
Pag 102
Estructura de datos
a
1 2
a
b b b b
a
3 4
a
Pag 103
Estructura de datos
1 2 3 4
1 a B
2 a b
3 b A
4 b a
Para evitar esta desventaja se puede utilizar otra representacin comn para
un grafo dirigido G=(V,A) llamada representacin con lista de adyacencia. La
lista de adyacencia para un vrtice i es una lista, en algn orden, de todos los
vrtices adyacentes a i. Se puede representar G por medio de un arreglo
CABEZA, donde CABEZA[i] es un apuntador a la lista de adyacencia del vrtice
i. La representacin con lista de adyacencia de un grafo dirigido requiere un
espacio proporcional a la suma del nmero de vrtices ms el nmero de
arcos; se usa bastante cuando el nmero de arcos es mucho menor que n .
Sin embargo, una desventaja potencial de la representacin con lista de
adyacencia es que puede llaeva un tiempo O(n) determinar si existe un arco
del vrtice i al vrtice j, ya que puede haber O(n) vrtices en la lista de
adyacencia para el vrtice i.
Pag 104
Estructura de datos
1 2 3
2 4
3 2
4
3
Grafos no dirigidos
Un grafo no dirigido G =(V,A) consta de un conjunto finito de vrtices V y de
un conjunto de aristas A. Se diferencia de un grafo dirigido en que cada arista
en A es un par no ordenado de vrtices. Si (v,w) es una arista no dirigida,
entonces (v,w) =(w,v).
Pag 105
Estructura de datos
#include <stdio.h>
struct card {
char *face;
char *suit;
};
main()
{
struct card a;
struct card *aPtr;
a.face = Ace;
a.suit = Spades;
aPtr = &a;
Ace of Spades
Ace of Spades
Ace of Spades
Pag 106