Vous êtes sur la page 1sur 99

Nombres : Claudio Ordenes

Wladimir Alvarez
Alejandro Moya
Roberto Vega
Julio Provoste
Profesor : Ricardo Corbinaud
Ctedra : Programacin


Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
1
Indicie

Pg.
1. Introduccin.. 2
2. Cdigo Fuente. 3
3. Cdigo Objeto.. 3
4. Ejecutable 3
5. Etapas de la compilacin. 3
6. Orgenes del C. 4
7. Caractersticas. 4
8. Estructura del C... 4
9. Tipos de Datos. 5
10. Operadores.. 6
11. Operadores Div. (/)y Mod (%).... 8
11.1. Ejercicios resueltos 8
12. Sentencias bsicas en C....................................................................................... 11
12.1. Ejemplos Sentencia If-Else 11
12.2. Ejemplos Sentencia While.... 15
12.3. Ejemplos Sentencia For. 20
13. Memoria Esttica. 24
14. String.... 25
14.1. Ejercicios Resueltos String................................................................ 26
15. Arreglos o Array................................................................................................. 33
15.1. Ejercicios Resueltos Array................................................................ 34
16. Funciones............................................................................................................. 42
16.1. Ejercicios Resueltos Funciones.............................................. 43
17. Procedimientos................................................................................................... . 48
17.1. Ejercicios Resueltos Procedimientos. 48
18. Recursividad........................................................................................................ 51
18.1. Ejercicios Resueltos Recursividad..................................................... 51
19. Recursividad v/s Iteracin.................................................................................... 57
20. Memoria Dinmica... 58
21. Listas Lineales Simples (LLS)... 60
21.1. Ejercicios Resueltos (LLS).................................................................. 65
22. Listas Circulares (LCS)......................................................................................... 71
22.1. Ejercicios Resueltos (LCS)................................................................. 74
23. Lista lineal doblemente enlazada (LLD)... 76
23.1. Ejercicios Resueltos (LLD).................................................................. 80
24. Multilistas.............................................................................................................. 84
24.1. Ejercicios Resueltos Multilistas........................................................... 85
25. rboles.................................................................................................................. 88
25.1. Ejercicios Resueltos rboles... 94
26. Conclusin. 97
27. Bibliografa 98







Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
2
1.- Introduccin

El trabajo que se presenta es una recopilacin de los temas tratado en clases
correspondientes al semestre pasado en el ramo de programacin, el objetivo del trabajo no
pretende ser un manual completo del lenguaje C, que explique en forma detallada cada
funcin y menos an tratar detallar todas las posibilidades que presenta este lenguaje, sino
que una base til para que cualquiera pueda introducirse en este interesante mundo del
lenguaje C.

Podemos decir que este lenguaje, es un lenguaje de nivel medio, ya que combina
elementos de lenguaje de alto nivel con la funcionalidad del lenguaje ensamblador. Es un
lenguaje estructurado, ya que permite crear procedimientos en bloques dentro de otros
procedimientos. Hay que destacar que el C es un lenguaje portable, ya que permite utilizar el
mismo cdigo en diferentes equipos y sistemas informticos: el lenguaje es independiente de
la arquitectura de cualquier mquina en particular.

Por ltimo solo queda decir que el C es un lenguaje relativamente pequeo; se puede
describir en poco espacio y aprender rpidamente.

































Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
3
2.- Cdigo Fuente

Se define como un conjunto de lneas que conforman un bloque de texto, escrito segn
las reglas sintcticas de algn lenguaje de programacin destinado a ser legible por humanos.
Un Programa en su forma original, tal y como fue escrito por el programador, no es ejecutable
directamente por el computador, debe convertirse en lenguaje de maquina mediante
compiladores, ensambladores o intrpretes.

En el caso del C estos archivos tienen la extensin .C.

3.- Cdigo Objeto

Se llama cdigo objeto en programacin al cdigo resultante de la compilacin del
cdigo fuente, es decir el cdigo fuente es transformado a un lenguaje entendible por el
procesador. Los archivos en cdigo objeto en c tiene la extensin .OBJ.

4.- Ejecutable

Es el resultado de la compilacin de un archivo fuente y un archivo objeto, dando
como resultado archivo binario cuyo contenido se interpreta por el ordenador como un
programa.
En C estos tiene la extensin .EXE.

5.- Etapas de la compilacin



Figura: etapas de compilacin










Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
4
6.- Orgenes del C

El lenguaje C fue inventado por Dennos Ritchie en 1972 cuando trabajaba, junto con
Ken Thompson, en el diseo del sistema operativo UNIX. El lenguaje C deriva del lenguaje B
de Thompson, el cual, a su vez, deriva del lenguaje BCPL desarrollado por Martn Richards.
Durante muchos aos el estndar de C fue la versin proporcionada con el sistema operativo
UNIX versin 5., pero pronto empezaron a surgir muchas implementaciones del C a raz de la
popularidad creciente de los microordenadores. Por este motivo, se hizo necesario definir un
C estndar que est representado hoy por el ANSI C.

7.- Caractersticas

Es un lenguaje de propsito general, lo que explica que se ha utilizado para el
desarrollo de aplicaciones tan dispares como: hojas de clculos, gestores de bases de
datos, compiladores, sistemas operativos.
Es un lenguaje de medio nivel, lo cual significa que el lenguaje permite programar a
alto nivel (pensando a nivel lgico y no en la mquina fsica) y a bajo nivel (con lo
que se puede obtener la mxima eficiencia y un control absoluto de cuanto sucede en
el interior del ordenador).
Es un lenguaje porttil, es decir los programas escritos en C son fcilmente
transportables a otros sistemas operativos.

8.- Estructura de C
Todo programa en C consta de una o ms funciones, una de las cuales se llama main.
El programa comienza en la funcin main, desde la cual es posible llamar a otras
funciones.
Cada funcin estar formada por la cabecera de la funcin, compuesta por el nombre
de la misma y la lista de argumentos (si los hubiese), la declaracin de las variables a
utilizar y la secuencia de sentencias a ejecutar.
Declaraciones globales
main ( )
{
variables locales
bloque
}
funcion1 ( ) {
variables locales
bloque
}










Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
5
9.- Tipos de datos

Tipo INT (Entero); en este tipo de variables solo se almacenan nmeros enteros (sin
decimales) y el rango de valores que se permiten son del 32767 al 32767, pero para
utilizar este rango se debern utilizar 16 bits de la memoria (2
16
=32767). Cuando
definimos una variable de este tipo, en realidad estamos indicando al compilador que
nos reserve un espacio de memoria para almacenar un tipo de dato INT.
Ejemplo:
int numero; lo cual significa que estamos declarando una variable que se
llamara numero y que contendr un nmero entero.

Tipo CHAR (Caracteres); este tipo de variables se utiliza para almacenar letras, pero
en realidad son almacenadas como nmeros del 0 al 255, siendo los 128 primeros (0 al
127) del ASCII estndar.
Ejemplo:
char letra; en este tipo de variable slo podemos almacenar una letra, no
podemos almacenar ni frases ni palabras.

Tipo FLOAT (decimales); en este tipo de variable podemos almacenar nmeros
decimales y no solo enteros como en el tipo int. El rango de posibles valores es del
3,4E-38 al 3,4E38.
Ejemplo:
float numero; en este tipo de variables se almacenan nmeros en formato de
coma flotante, es decir nmeros con decimales.

Tipo DOUBLE (decimales dobles); al igual que tipo float almacena nmeros
decimales. Normalmente utilizados para almacenar nmeros grandes.
Ejemplo:
double numero; Los valores de este tipo son nmeros reales, de mayor rango
y con aproximaciones ms precisas que los de tipo Float.





















Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
6
10.- Operadores

Estos son utilizados para manipular datos y en este lenguaje en particular encontramos
bastantes, pero solo detallaremos los que mas utilizamos.

Asignacin: El operador bsico de asignacin es "=", a primera vista se puede pensar
que es el operador de comparacin "igual ", pero no es as, lo que realmente significa
es que el operando de la izquierda toma el valor de la expresin a la derecha.
Ejemplo:
x = 3; en este ejemplo se asigna el valor 3 a una variable de tipo int.

Aritmticos: este tipo de operadores nos permiten, bsicamente, hacer cualquier tipo
de operacin aritmtica, que necesitemos por ejemplo: suma, resta, multiplicacin, etc.
o Prioridad de los Operadores Aritmticos
Todas las expresiones entre parntesis se evalan primero, las expresiones con
parntesis anidados se evalan de dentro a fuera, el parntesis ms interno se
evala primero.
Dentro de una misma expresin los operadores se evalan en el siguiente
orden:
^ exponenciacin.
*, /, mod multiplicacin, divisin, modulo.
+, -, suma y resta.
Los operadores en una misma expresin con igual nivel de prioridad se evalan de
izquierda a derecha.

Ejemplos:



En la siguiente tabla se muestran los operadores de los que disponemos en C y su
funcin asociada.

Operador Accin Ejemplo
- Resta x = 5 3; // x vale 2
+ Suma x = 5 + 3; // x vale 8
* Multiplicacin x = 5 * 3; // x vale 15
/ Divisin x = 6 / 3; // x vale 2
% Mdulo x = x = 5 % 2; // x vale1
--
Decremento x = 1; x --; // x vale 0
++
Incremento x = 1; x ++; // x vale 2









4 + 2 * 5 = 14 23 * 2 / 5 = 9.2
3 + 5 * (10 - (2 + 4)) = 23 2.1 * (1.5 + 12.3) = 2.1 * 13.8 = 28.98

Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
7
Relacin: Los operadores de relacin se utilizan para comparar el contenido de dos
variables. En C existen 6 tipos de operadores de relacin.

Operador Accin
> Mayor que
> Menor que
>= Mayor o igual que
<= Menor o igual que
= = Igual que
!= Distinto que

Nota: El resultado que devuelven estos operadores es 1 para verdadero y 0 para falso

Lgicos: estos operadores producen un resultado booleano (cierto o falso), y estos
actan en expresiones lgicas, adems permiten unir expresiones lgicas simples
formando otras ms complejas.
En la siguiente tabla se muestran los operadores de los que disponemos en C y su
funcin asociada.

Palabra Clave Smbolo Descripcin
AND && Operador Y lgico
OR || Operador O lgico
NOT ! Operador negacin lgica




Ejemplo de uso de los operadores lgicos.






















#include <stdio.h>
#include <conio.h>
main() /* Compara un nmero introducido */
{
int numero;
clrscr();
printf("Introduce un nmero: ");
scanf("%d",&numero);
if(!(numero>=0))
printf("El nmero es negativo");
else if((numero<=100)&&(numero>=25))
printf("El nmero est entre 25 y 100");
else if((numero<25)||(numero>100))
printf("El nmero no est entre 25 y 100");
getche();
}


Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
8
11.- Operadores Div ( / ) y Mod ( % )

La divisin de dos nmeros, sin importar su tipo, dar como resultado un nmero real,
as que para dividir dos enteros, y obtener el resultado como entero, el lenguaje C ofrece el
operador DIV, el cual da el resultado entero de una divisin entre enteros, y el operador MOD
que regresa el residuo de una divisin de enteros.

El operador div (/), divide dos nmeros y devuelve el cuociente o entero, como resultado de la
divisin. Por ejemplo en la siguiente divisin 10: 5, el operador div devolver el nmero 2
como resultado esta operacin.
El operador mod (%), divide de dos nmeros y devuelve el resto de la divisin realizada, en
el ejemplo anterior el operador mod devolvera como resultado el nmero 0.

Los operadores aritmticos div y mod, solo se pueden utilizar con nmeros enteros.

11.1.- Ejercicios resueltos

1.- Programa que suma los dgitos de un nmero entero positivo













2.- Rutina que indica si un nmero entero positivo es par o impar.


















void main()
{
int n, d, s;
printf("Introduce un nmero: ");
scanf("%d", & n);
while (n! = 0)
{ d = n % 10;
s = s + d;
n = n /10;
}
printf( % d, s);
}
void main()
{
int n;
printf("Introduce un nmero: ");
scanf("%d", & n);
{ if (n % 2 = 0);
printf( El nmero es par );
else
printf( El nmero NO es par );
}
getche();
}

Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
9
3.- Rutina que entrega el residuo de una divisin.
















4.- Funcin que retorna un nmero invertido.
































#include <conio.h>
#include <stdio.h>
main()
{
int num1,num2,total;
printf("Programa que despliega residuo");
printf("\n\n Dame el numero 1: ");
scanf("%d",&num1);
printf("\n\n Dame el numero 2: ");
scanf("%d",&num2);
total = num1 % num2;
printf("El residuo es: %d ",total);
getch();
return 0;
}
Int invierte (int num)
{
int inverso, num;
printf("Introduce un nmero: ");
scanf("%d", & num);
inverso = 0;
while (num!= 0 )
{
inverso = (inverso * 10) + (num %10);
num = num / 10;
return inverso;
}

Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
10
5.- Procedimiento que lee un entero positivo e indica si es perfecto. Un n es perfecto cuando
es igual a la suma de sus divisores excepto el mismo.

















6.- Programa que divide el mayor entre el menor






























#include <stdio.h>
void main()
int i, numero, suma=0;
printf("Dame un numero:");
scanf("%d",&numero);
{
while (numero<=0);
for (i =1; i <= (numero / 2); i++)
if ((numero % i) = =0)
suma+=i;
if (numero= =suma)
printf("El numero es perfecto.");
else
printf("El numero NO es perfecto.");
}
#include
#include
void main()
{
float a,b,r;
clrscr();
printf("dame los nmeros que vas a dividir\n");
scanf("%f",&a);
scanf("%f",&b);
{ if(a < b)
r = b/a;
else
r = a/b;
}
printf("la divisin del mayor entre el menor es: %.3f",r);
getch();
}

Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
11
12.- Sentencias Bsicas en C

Las sentencias bsicas en C son las que especifican y controlan el flujo de ejecucin del
programa, si no existieran sentencias especficas de seleccin o iteracin, el programa se
ejecuta de forma secuencial en el mismo orden en que se ha escrito el cdigo fuente.

Sentencia de Seleccin o Control de Flujo
Las sentencias de seleccin, tambin llamadas de control de flujo, permiten decidir
entre distintos cursos de accin en funcin de ciertos valores.

- If-Else;
Cuando no existe la clusula else, esta sentencia permite escoger entre ejecutar o no
una sentencia, en funcin del resultado de una expresin lgica. En su forma ampliada,
cuando la clusula else est presente, permite escoger entre dos opciones alternativas.

Sintaxis:

if (condicin)
{ <sentencia1>;
}
else {
<sentencia2>;
}

12.1.- Ejemplos Sentencia If-Else

1.- Programa que indica cual es mayor entre 2 nmeros

#include <stdio.h>
#include <conio.h>
void main()
{
int a,b,c;
printf("ingrese dos nmeros para decir cual es el
mayor\n");
scanf("%f",&a);
scanf("%f",&b);
/*-----------desde aqu empieza a comparar---------------- */
if (a>b)
{ printf("el mayor es: % d ",a);
}
Else
{ printf("el mayor es: % d ",b);
}
return 0;






Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
12

2.- Programa que solicita dos nmeros e indica si son iguales, o cual es mayor o
menor.
#include <conio.h>
#include <stdio.h>
main()
{
int x,y;
printf("Programa que usa el IF");
printf("\n\n Escribe un valor entero para x:");
scanf("%d",&x);
printf("\n Escribe un valor entero para y:");
scanf("%d",&y);
{ if(x = = y)
printf("x es igual a y");
else
if(x>y)
printf("x es mayor que y");
else
printf("x es menor que y");
}
getch();
return 0;
}

3.- Programa que indica si es mayor de edad

#include <conio.h>
#include <stdio.h>
int edad;
printf(Ingrese su edad: \n);
scanf(%d, &edad);
if (edad>=18)
{
printf(Usted es mayor de edad. \n);
}
else
{
printf(Usted es menor de edad. \n);
}











Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
13
4.- Programa que calcula el promedio de 4 notas e indica su resultado.

#include <conio.h>
#include <stdio.h>
int n1,n2,n3,n4,res;
printf(Ingrese primera nota 1: \n);
scanf(%d, &n1);
printf(Ingrese primera nota 2: \n);
scanf(%d, &n2);
printf(Ingrese primera nota 3: \n);
scanf(%d, &n3);
printf(Ingrese primera nota 4: \n);
scanf(%d, &n4);
res = (n1+n2+n3+n4) / 4
if (res >= 4.0)
{
printf(Usted esta aprobado. \n);
}
else
{
printf(Usted esta reprobado.\n);
}





























Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
14
- If-Else if;
Esta sentencia es solo una sucesin de If-Else anidados.
Sintaxis:
if ( condicin1)
<sentencia1> ;
else if ( condicin2 )
<sentencia2> ;
else if ( condicin3 )
<sentencia3> ;
else
<sentencia4> ;

Ejemplos de su utilizacin:

1.- Programa indica cual es mayor entre 3 nmeros

#include <stdio.h>
#include <conio.h>
void main()
{
int a,b,c;
printf("ingrese dos nmeros para decir cual es el
mayor\n");
scanf("%f",&a);
scanf("%f",&b);
scanf("%f",&c);
/*-----------desde aqu empieza a comparar---------------- */
if (a>b)&&(a>c)
{ printf("el mayor es: % d ",a);
}
Else
{ if (b>a)&&(b>c)
printf("el mayor es: % d ",b);
}
Else
{ printf("el mayor es: % d ",c);
}
return 0;













Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
15
Sentencia de Iteracin
Las sentencias de iteracin permiten repetir una sentencia o conjunto de ellas. Es lo
que se denomina ejecutar un bucle. En C existen tres formas de iteraciones, las cuales
se detallan:

- While
Esta sentencia permite ejecutar repetidamente un bloque de cdigo mientras se cumpla
una determinada condicin verdadera, la cual es chequeada antes de cada iteracin.
Sintaxis:

while (condicin)
{
sentencia ;
}


12.2.- Ejemplos Sentencia While

1.- Rutina que imprima los primeros 10 primeros nmeros enteros empezando por el
cero










2.- Programa que calcula la suma de 1 hasta N.



















void main()
{
int x;
x = 0;
while (x<10)
printf(x);
x = x+1;
}
#include <stdio.h>
#include <conio.h>
void main()
{
int n, suma, cont;
clrscr()
printf("Limite para la sumatoria: ");
scanf("%d",& n);
cont=1;
suma=0;
while(cont<= n)
{ suma = cont + suma;
cont = cont + 1;
}
printf("Suma: %d", suma);
getch();
}

Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
16
3.- Programa que lee N nmeros y calcula su promedio.























4.- Programa que muestra los nmeros pares del 0 al 100

























#include <stdio.h>
#include <conio.h>
void main()
{
int _cant;
int _cont;
int _valor;
int _suma;
float _prom;
cont = 1;
suma = 0;
printf("Nmeros: ");
scanf("%d",&_cant);
while(_cont<=_cant)
{ scanf("%d",&_valor);
_suma =_suma + _valor;
_cont = _cont + 1;
}
_prom=_suma/_cant;
printf("Promedio: %.2e",_prom);
getch();
}
#include <stdio.h>
#include <conio.h>
void main()
{
int cont;
while(cont <= 100)
{
if(cont %2 = = 0) // verifica si es par //
{
printf("%d, ", cont);
}
cont = cont + 1 ;
}
getch();
}

Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
17
5.- Programa que calcula el factorial de N.



















6.- Programa que repite un carcter un nmero determinado de veces.





























#include <stdio.h>
#include <conio.h>
void main()
{
int conta, limi, num;
printf("valor: ");
scanf("%d",& num);
limi = num;
conta = 1;
num =1;
while(conta<= limi)
{
num = num * conta;
conta = conta + 1;
}
printf("Factorial de %d = %d", limi, num);
getch();
}
#include <stdio.h>
#include <conio.h>
main()
{
char ch;
int num_rep;
printf("\n Escriba el carcter a repetir: ");
scanf("%c",&ch);
printf("\n Escriba el numero de repeticiones: ");
scanf("%d",&num_rep);
while (num_rep>0)
{
printf("%c",ch);
--num_rep;
}

Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
18
7.- Programa que suma los nmeros comprendidos entre el 1 y el 10














8.- Programa que calcula la suma de los enteros del 1 al 5.













9.- Programa Despliega el cdigo ascci en carcter, decimal, octal y hexadecimal




















#include <stdio.h>
#include <conio.h>
main()
{
int n, x;
n = 0;
x = 0;
while n <= 10
printf("%d",x);
n = n + 1;
x = x + n;
return ;
}
#include <stdio.h>
void main(void)
{
int i = 1,
suma = 0;
while (i <= 5)
{ suma = suma + i;
i = i + 1;
}
printf("suma = %d\n", suma);
}
#include <stdio.h>
#include <conio.h>
#include <dos.h>
void main()
{
int _c;
clrscr();
_c=1;
while(_c<=255)
{ printf("%d | %c | %o | %x | \n",_c,_c,_c,_c);
_c++; / * incremento del contador * /
delay(10);
}
getch();
}

Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
19
10.- Programa que despliega las letras minsculas.

















































#include <stdio.h>
#include <conio.h>
void main(){
clrscr();
int _chr;
_chr =97; // * a inicio *//
// * final 122 -> z *//
while(_chr<=122)
{
printf("%c, ",_chr);
_chr++; / * incremento del contador * /
}
getch();
}

Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
20
- For
Esta sentencia de control la ms potente y usada en C, consta de tres expresiones:
la primera es la inicializacin del bucle, la segunda indica la condicin en la que se
debe continuar el bucle y la tercera es la que se encarga de incrementar los ndices del
bucle.
Sintaxis:

for ( expresion1; expresion2; expresion3)
{
sentencia;
}

12.3.- Ejemplos Sentencia For

1.- Rutina que imprime los primeros 10 nmeros pares











2.- Rutina que calcula la suma de 1 hasta N.























void main()
{
int i;
i = 1;
for(i =1; i <=10; i ++)
{
printf(i);
}
}
#include <conio.h>
#include <stdio.h>
void main()
{
int valor;
int y = 0;
int cont1 = 0;
int cont2 = 0;
printf("Valor: ");
scanf("%d",& valor);
for( y = 0; y <= valor; cont2++)
{
cont1 = cont1 + cont2;
}
printf("La sumatoria es: %d ",cont1);
getch();
}

Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
21
3.- Rutina que muestra los nmeros pares del 0 al 100













4.- Rutina que calcula la suma de los nmeros del 1 al 100














5.- Programa que permite averiguar si un nmero es o no primo




















#include <conio.h>
#include <stdio.h>
void main()
{
int conta;
for(conta = 0; conta <= 100; conta = conta+2)
{
printf("%d, ", conta);
}
getch();
}
#include <conio.h>
#include <stdio.h>
void main()
{
int numero, suma;
numero = 1;
suma = 0;
for (numero =1; numero<=100; numero++)
{
suma = suma + numero;
}
}
#define TRUE 1
#define FALSE 0
int primo(int);
void main()
{int n, i;
printf("\n Ingrese un nmero:");
scanf("%d",& n);
for (i = 1;i <= n ; i++)
if(primo(i))
printf(" %d ",i);
}
int primo (int n)
{
int i;
for (i=2;i<=(n / 2);i++)
if((n % i)==0)
return FALSE;
else return TRUE;
}

Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
22
6.- Programa que de dados N nmeros dice cual es mayor y cual es menor






















7.- Programa que Despliega todos los caracteres menos el abecedario
















8-. Programa que suma los cinco primeros enteros









#include <conio.h>
#include <stdio.h>
void main(){
int cont,num=0,limit=0,may=0,men=100;
clrscr();
printf("limite");
scanf("%d",& limit); /* obtengo limite */
for(cont=1;cont<=limit;cont++)
{
printf("Valor%d:cont);
scanf("%d",&num);
if(may<num)
{may=num;
}
if(men>num)
{men=num;
}
printf("Mayor es: %d",may);
printf("Menor es: %d",men);
getch();
}
#include <conio.h>
#include <stdio.h>
main(){
int cont;
clrscr();
for(cont=1;cont<=255;cont++)
{
printf("%c, ",cont);
if(z = = 64)
{
z =122;
}
}
getch();
}
#include <stdio.h>
void main(void)
{
int i, suma;
suma = 0;
for(i=0; i<=5; i++)
suma += i;
printf("La suma de los cinco primeros nmeros es: %d\n", suma);
}

Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
23
9.- Programa que lee un entero positivo e indica si es perfecto, un n es perfecto
cuando es igual a la suma de sus divisores excepto el mismo
























10.- Programa que cuenta y muestra en pantalla los mltiplos de 3 entre 1 y 100.























#include <stdio.h>

void main()
{
int i,numero,suma=0;
{
printf("Dame un numero:");
scanf("%d",&numero);
}
while (numero<=0);
{
for (i=1;i<=(numero/2);i++)
if ((numero % i)==0)
suma+=i;
}
if (numero==suma)
{
printf("El numero es perfecto.");
else
printf("El numero NO es perfecto.");
}
}
#include <stdio.h>
int main()
{
int contador,cuentamult;
cuentamult = 1;
printf ("\nEstos son los nmeros mltiplos de tres
entre 1 y 100");
for(contador=1; contador<=100; contador++)
{
if (contador % 3 == 0)
printf("contador);
cuentamult++;
}
printf("\n El nmero total de mltiplos de 3
entre 1 y 100 es:,cuentamult) ;
getch();
return 0;
}

Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
24
13.- Memoria Esttica

La memoria esttica es memoria que se reserva en el momento de la compilacin,
antes de comenzar a ejecutarse el programa. Por ejemplo, para una resolucin de un sistema
de ecuaciones lineales, la memoria esttica se puede reservar con sentencias del tipo:

double a [100] [100], x [100], b [100];

El inconveniente de la reserva esttica es que la cantidad de memoria se reserva siempre antes
de conocer los datos concretos del problema a resolver. Eso lleva a reservar siempre un
mximo de memoria que en la mayor parte de las ocasiones no se va a necesitar. La reserva
esttica tampoco se adapta bien a la memoria real disponible en el ordenador en que se est
ejecutando el programa.

La forma ms fcil de almacenar el contenido de una variable en memoria en tiempo de
ejecucin es en memoria esttica o permanente a lo largo de toda la ejecucin del programa.
No todos los objetos (variables) pueden ser almacenados estticamente. Para que un objeto
pueda ser almacenado en memoria esttica su tamao (nmero de bytes necesarios para su
almacenamiento) ha de ser conocido en tiempo de compilacin. Como consecuencia de esta
condicin no podrn almacenarse en memoria esttica:

Los objetos correspondientes a procedimientos o funciones recursivas, ya que en
tiempo de compilacin no se sabe el nmero de variables que sern necesarias.
Las estructuras dinmicas de datos tales como listas, rboles, etc. ya que el nmero de
elementos que la forman no es conocido hasta que el programa se ejecuta.


Figura: Asignacin en memoria de un objeto x

Las tcnicas de asignacin de memoria esttica son sencillas. A partir de una posicin
sealada por un puntero de referencia se aloja el objeto X, y se avanza el puntero tantos bytes
como sean necesarios para almacenar el objeto X. La asignacin de memoria puede hacerse
en tiempo de compilacin y los objetos estn vigentes desde que comienza la ejecucin del
programa hasta que termina.







Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
25
14.- String

Los strings son arreglos unidimensionales de tipo CHAR o tambin llamados cadenas
de caracteres. Por convencin, un string en C se termina con el carcter nulo "\0". Por
ejemplo, si tenemos char a [5], el elemento a [4] es el "\0".
La ventaja de los strings es que podemos rellenar y consultar varios elementos del array a la
vez.
Internamente se almacenan en posiciones consecutivas de memoria. Este tipo de estructuras
recibe un tratamiento especial, y es de gran utilidad y de uso continuo.
La manera de definir una cadena es la siguiente:

char <identificador> [<longitud mxima>];

Nota: En este caso los corchetes no indican un valor opcional, sino que son realmente
corchetes, por eso estn en negrita.

Cuando se declara una cadena hay que tener en cuenta que tendremos que reservar una
posicin para almacenar el carcter nulo, de modo que si queremos almacenar la cadena
"HOLA", tendremos que declarar la cadena como:

char Saludo [5];

Cuatro caracteres para "HOLA" y uno extra para el carcter '\000'.

Tambin nos ser posible hacer referencia a cada uno de los caracteres individuales que
componen la cadena, simplemente indicando la posicin. Por ejemplo el tercer carcter de
nuestra cadena de ejemplo ser la 'L', podemos hacer referencia a l como Saludo [2]. Los
ndices tomarn valores empezando en el cero, as el primer carcter de nuestra cadena sera
Saludo [0], que es la 'H'.

Una cadena puede almacenar informaciones como nombres de personas, mensajes de error,
nmeros de telfono, etc.
La asignacin directa slo est permitida cuando se hace junto con la declaracin. Por
ejemplo:
char Saludo [5];
Saludo = "HOLA"
Producir un error en el compilador, ya que una cadena definida de este modo se considera
una constante, como veremos en el captulo de "arrays" o arreglos.
La manera correcta de asignar una cadena es:
char Saludo [5];
Saludo [0] = 'H';
Saludo [1] = 'O';
Saludo [2] = 'L';
Saludo [3] = 'A';
Saludo [4] = '\000';
O bien:
char Saludo [5] = "HOLA";




Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
26
14.1.- Ejercicios Resueltos String

1.- Programa que compara dos cadenas de caracteres y dice si son iguales o no















































#include <conio.h>
#include <stdio.h>
main( )
{
char a[100],b[100];
int i,bandera=0;
clrscr();
for(i=0;i<100;i++)
{
a[i]=0;
b[i]=0;
}
printf("Dame la cadena 1: ");
gets(a);
printf("\n Dame la cadena 2: ");
gets(b);
for(i=0;i<100;i++)
{
if(a[i]==b[i])
bandera++;
}
if(bandera==100)
printf("\n\n La cadena es igual");
else
printf("\n\n La cadena no es igual");
getch();
return 0;
}

Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
27
2.- Programa que reemplaza todas las ocurrencias de un carcter en una frase

















































#include <conio.h>
#include <stdio.h>
main()
{
char a[100];
char caracter[1], remplazo[1];
int i;
clrscr();
for(i=0;i<100;i++)
{
a[i]=0;
}
printf("Dame la cadena: ");
gets(a);
printf("\n Dame el caracter a remplazar: ");
gets(caracter);
printf("\n Dame el remplazo: ");
gets(remplazo);

for( i =0;i<100;i++)
{
if(caracter[0]==a[i])
a[i]=remplazo[0];
}
puts(a);
getch();
return 0;
}

Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
28
3.- Rutina que borra un carcter de una cadena
































4.- Rutina que indica la longitud de una cadena, utilizando vectores
















#include <conio.h>
#include <stdio.h>
main()
{
char a[100];
char caracter[1];
int i,j;
clrscr();
printf("Dame la cadena: ");
gets(a);
printf("\n Dame el caracter a borrar: ");
gets(caracter);
i=0;
while(a[i]!='\0')
{
if(caracter[0]==a[i])
{
j=i;
while(a[j]!='\0')
{
a[j]=a[j+1];
j++;
}
i--;
}
i++;
}
puts(a);
getch();
return 0;
}
#include <conio.h>
#include <stdio.h>
main( )
{ char cad[40];
int i;
clrscr();
printf("Escriba una cadena: ");
scanf("%s",cad);
i=0;
while (cad[i]!='\0')
i++;
printf("La cadena tiene una longitud de: %d",i);
getch();
return 0;
}

Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
29
5-. Programa que lee una palabra y la escribe al revs


















6-. Leer una frase (lnea) y escribirla al revs usando getchar para escanear






























#include <stdio.h>

void main (void) {
char c, palabra[21];
int i;
printf("Teclea una palabra de menos de 20
letras:\n");
scanf("%s", palabra);
i=0;
while (palabra[i++]!='\0');
printf("%s tiene %d letras.\n", palabra, i-1);
printf("%s escrita al revs es: ", palabra);
while (i>0)
printf("%c", palabra[--i]);
printf("\n");
}
#include <stdio.h>
void main(void) {
char c, frase[100];
int i, n;
printf("Introduce una frase de menos de 100 letras.\n");
printf("Para finalizar pulsa ^Z:\n");
i=0;
while((c=getchar())!=EOF) {
frase[i]=c;
i++;
}
frase[i]='\0';
printf("\n");
for (n=i; n>=0; n--)
putchar(frase[n]);
printf("\n");
}

Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
30
7.- Leer una frase (lnea) y escribirla al revs usando scanf para escanear



















8.- Programa convierte las maysculas en minsculas y viceversa, escribe el texto
cambiado al revs




























#include <stdio.h>
#include <string.h>

void main(void) {
char frase[100];
int i, n;

printf("Introduce una frase de menos de 100 letras.\n");
printf("Para finalizar pulsa Intro:\n");
i=0;
scanf(" %[^\n]", frase);
printf("\n");
for (n=strlen(frase)-1; n>=0; n--)
putchar(frase[n]);
printf("\n");
}
#include <stdio.h>

void main(void) {
int ch;
char texto[101]; /* limite de caracteres del texto */
int i, n, dif;

dif='a'-'A';
printf("Introduce un texto de no mas de 100
caracteres.\n");
printf("Pulsa ^Z para finalizar:\n");
i=0;
while ((ch=getchar())!=EOF) {
if ((ch>='a')&&(ch<='z')) /* es minscula */
ch-=dif;
else if ((ch>='A')&&(ch<='Z')) /* es mayscula */
ch+=dif;
texto[i++]=ch;
}
texto[i]='\0';
for (n=i; n>=0; n--)
printf("%c", texto[n]);
printf("\n");
}

Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
31
9.- Programa que pide diez palabras y las ordena por orden alfabtico

















































#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void main(void) {
char **cadena; /* declaracin de puntero a matriz de caracteres */
int i, j;
char temp[20]; /* declaracin del array auxiliar */
char *aux; /* declaracin de puntero a carcter, auxiliar */

printf("%s%s\n", "Este programa ordena diez palabras");
printf("Introduce las diez palabras:\n");
cadena = malloc(10*sizeof(char*));
for (i=0; i<10; i++) {
printf("Palabra %d: ", i+1);
scanf("%s", temp);
cadena[i]=malloc((strlen(temp)+1)*sizeof(char));
strcpy(cadena[i], temp);
}
/* se ordenan las palabras alfabticamente */
for (i=0; i<9; i++) {
for(j=i+1; j<10; j++) {
if ((strcmp(cadena[i], cadena[j]))>0) {
aux=cadena[i];
cadena[i]=cadena[j];
cadena[j]=aux;
}
}
}
printf("La cadena ordenada es:\n");
for (i=0; i<10; i++)
printf("%s\n", cadena[i]);
}

Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
32
10.- Programa que ordena alfabticamente diez nombres completos de
personas compuestos de primer apellido, segundo apellido y nombre.
















































#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void main(void) {
char **cadena, *aux;
int i, j, n=3;
char temp[20];

printf("%s%s\n", "Este programa ordena diez
nombres ",
"introducidos por teclado.");
printf("Introduce los diez nombres:\n");
cadena = (char**)malloc(10*sizeof(char*));

for (i=0; i<n; i++) {
printf("Nombre %d: ", i+1);
scanf(" %[^\n]", temp);

cadena[i]=(char*)malloc((strlen(temp)+1)*sizeof(char));
strcpy(cadena[i], temp);
}

for (i=0; i<n-1; i++)
for (j=i+1; j<n; j++)
if ((strcmp(cadena[i], cadena[j]))>0) {
aux=cadena[i];
cadena[i]=cadena[j];
cadena[j]=aux;
}
printf("La lista ordenada es:\n");
for (i=0; i<n ; i++)
printf("%s\n", cadena[i]);
/* se libera la memoria reservada */
for (i=0; i<n; i++)
free(cadena[i]);
free(cadena);
}

Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
33
15.- Arreglos o Arrays

Un arreglo o arrays una coleccin ordenada de elementos de un mismo tipo de datos,
agrupados de forma consecutiva en memoria, se accede a cada elemento individual del array
mediante un nmero entero denominado ndice, [0] es el ndice del primer elemento y [n-1] es
el ndice del ltimo elemento, siendo n, la dimensin del arreglo o arrays.

Los arreglos o arrays son tipos de datos estructurados y los ms sencillos que son utilizados
en C.


Figura: un arreglo de nmeros enteros.

La figura muestra grficamente un arreglo de nmeros enteros, en la cual se observa
claramente que el ndice del primer elemento del arreglo es el nmero 0.

Sintaxis para declarar un arreglo
tipo nombre [tamao];

En donde;
Tipo : El tipo de los elementos que compondrn el array
Nombre : El nombre de nuestro array
Tamao : Un nmero entero mayor que cero que indica el tamao del array
Ejemplos:

int array1[100]; /* Declara un array de 100 elementos enteros */
char array2[15]; /* Declara un array de 15 caracteres */
















Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
34
15.1. Ejercicios Resueltos Arrays

1.- Inicializar un arreglo en C.














2.- Calcula la suma de los elementos de un arreglo
































#include <stdio.h>
int main()
{ int n[ 10 ]; //* n es un arreglo de 10 enteros *//
int i;
for ( i = 0; i < 10; i++ ) {
n[ i ] = 0; // * establece el elemento i a 0 *//
}
printf( "%s%13s\n", "Elemento", "Valor" );
for ( i = 0; i < 10; i++ ) {
printf( "%7d%13d\n", i, n[ i ] );
}
return 0;
#include <stdio.h>
#define TAMANIO 12
int main()
{
int a[ TAMANIO ] = { 1, 3, 5, 4, 7, 2, 99, 16, 45,
67, 89, 45 };
int i;
int total = 0; //* suma del arreglo *//
for ( i = 0; i < TAMANIO; i++ ) {
total += a[ i ];
}
printf( "El total de los elementos del arreglo es
%d\n", total );
return 0;
}

Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
35
3.- Programa que indica cual es el valor mayor y menor de todos los valores de un
arreglo.
















































#include <stdio.h>
#include <conio.h>
#include <stdlib.h> // * libreria con el prototipo de la funcion rand( )* //
void main( )
{
int cant,c,arreglo[100],hi=0,lo=0;
randomize( ); //* inicializa el generados de nmeros aleatorios*//
clrscr( );
cant=rand( )%15; //* damos numero aleatorio a la dimensin del vector *//
printf("Cantidad: %d\n\n",cant); //* simulamos la entrada del valor *//
for(c=1;c<=cant;c++)
{ arreglo[c]=rand( )%100; //* asignamos valores aleatorios *//
printf("arreglo[%d]= %d\n",c,arreglo[c]);
if(c==1)
{
lo=arreglo[c];
hi=arreglo[c];
continue;
}
if(arreglo[c]<lo)lo=arreglo[c];
if(arreglo[c]>hi)hi=arreglo[c];
}
printf("\n mayor: %d\n",hi);
printf("menor1: %d\n",lo);
getch( );
}

Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
36
4. Bsqueda lineal en un arreglo.

#include <stdio.h>
#define TAMANIO 100
int busquedaLineal( const int arreglo[], int llave, int tamanio );
int main()
{
int a[ TAMANIO ];
int x;
int llaveBusqueda;
int elemento;
for ( x = 0; x < TAMANIO; x++ ) {
a[ x ] = 2 * x;
}
printf( "Introduzca la llave de bsqueda entera:\n" );
scanf( "%d", &llaveBusqueda );
elemento = busquedaLineal( a, llaveBusqueda, TAMANIO );
if ( elemento != -1 ) {
printf( "Encontr el valor en el elemento %d\n", elemento );
}
else {
printf( "Valor no encontrado\n" );
}
return 0;
}

int busquedaLineal( const int arreglo[ ], int llave, int tamanio )
{
int n;
for ( n = 0; n < tamanio; ++n )
{ if ( arreglo[ n ] == llave ) {
return n;
}
}
return -1;
}














Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
37
5.- Programa que ordena un conjunto de nmeros enteros

















































#include <stdio.h>
#define SIZE 7
void main(void) {
int vector[SIZE];
int j, i, temp;

printf("Introduce los %d valores para ordenar:\n", SIZE);
for(i=0; i<SIZE; i++) {
printf("%d: ", i+1);
scanf("%d", &vector[i]);
printf("\n");
}
for(i=0; i<(SIZE-1); i++) {
for (j=i+1; j<SIZE; j++) {
if(vector[j]<vector[i]) {
temp=vector[j];
vector[j]=vector[i];
vector[i]=temp;
}
}
}
printf("El vector ordenado es:\n");
for(i=0; i<SIZE ; i++) {
printf("%d ", vector[i]);
}
printf("\n");
}

Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
38
6.- Programa que da el Producto de una matriz por vector

















































#include <stdio.h>
#define SIZE 3

void main(void) {
double matriz[SIZE][SIZE];
double vector[SIZE];
double solucion[SIZE];
double sum;
int i,j;

printf("Introduce los datos de la matriz:\n");
for(i=0; i<SIZE ; i++) {
for(j=0; j<SIZE; j++) {
printf("\n Elemento (%d,%d): ", (i+1), (j+1));
scanf(" %lf", &matriz[i][j]);
}
}
printf("\n\nIntroduce los datos del vector:\n");
for(i=0; i<SIZE ; i++) {
printf("\nElemento %d: ", (i+1));
scanf("%lf", &vector[i]);
}
for(i=0; i<SIZE; i++) {
sum=0;
for(j=0; j<SIZE; j++) {
sum+=matriz[i][j]*vector[j];
}
solucion[i]=sum;
}
printf("\nEl vector solucion es:\n");
for(i=0; i<SIZE; i++) {
printf("Elemento %d = %lf\n", i+1, solucion[i]);
}
}

Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
39
7.- Programa que calcula el determinante en una matriz de 3 x 3

















































#include <stdio.h>
#define SIZE 3
void main(void) {
double matriz[SIZE][SIZE];
double determinante;
int i, j;
FILE *fi;

printf("Introduzca los elementos de la matriz 3x3:\n");
fi = fopen("matriz.d", "r+");
for (i=0; i<SIZE; i++)
for (j=0; j<SIZE; j++) {
fscanf(fi, "%lf", &matriz[i][j]);
}
fclose(fi);
printf("\n");
determinante = matriz[0][0]*matriz[1][1]*matriz[2][2];
determinante += matriz[0][1]*matriz[1][2]*matriz[2][0];
determinante += matriz[1][0]*matriz[2][1]*matriz[0][2];
determinante -= matriz[0][2]*matriz[1][1]*matriz[2][0];
determinante -= matriz[0][1]*matriz[1][0]*matriz[2][2];
determinante -= matriz[0][0]*matriz[2][1]*matriz[1][2];
printf("La matriz introducida es:\n");
for (i=0; i<SIZE; i++) {
for (j=0; j<SIZE; j++)
printf("%8.2lf", matriz[i][j]);
printf("\n");
}
printf("\n Y su determinante es: %12.4lf\n", determinante);
}

Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
40
8.- Programa que calcula el promedio de N valores dados.






















9.- Programa que dice cuantas veces se repite un valor en un vector


























#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
void main(){

int cant,c,arreglo[100],suma=0;
float ma;
randomize();
clrscr();
cant=rand()%15;
printf("Cantidad: %d\n\n",cant);
for(c=1;c<=cant;c++){
arreglo[c]=rand()%100
printf("arreglo[%d]= %d\n",c,arreglo[c]);
suma=suma+arreglo[c];

ma=suma/cant;
printf("\nPromedio: %.2f",ma);
getch();
}
#include <stdio.h>
#include <conio.h>

#include <stdlib.h>
void main(){

int cant,c,valor,suma=0;
char arreglo[100];
randomize();
clrscr();
cant=rand()%15;
printf("Cantidad: %d\n\n",cant);
for(c=1;c<=cant;c++){
arreglo[c]=rand()%5;
printf("arreglo[%d]= %d\n",c,arreglo[c]);
}
printf("\nvalor a verificar: ");scanf("%d",&valor);
for(c=1;c<=cant;c++){
if(arreglo[c]==valor){
suma++;
}
}
printf("Repeticiones: %d",suma);

getch();

Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
41
10-.Programa que muestra los valores introducidos en un vector ordenados de forma
ascendente
















































#include <stdio.h>
#include <conio.h>

#include <stdlib.h>
void main(){

int cant,c,arreglo[100],c1,c2,t1,t2;
randomize();
clrscr();
cant=rand()%15;
printf("Cantidad: %d\n\n",cant);
for(c=1;c<=cant;c++){
arreglo[c]=rand()%100;
printf("arreglo[%d]= %d\n",c,arreglo[c]);
}

for(c1=cant;c1>=0;c1--){
for(c2=1;c2<=c1;c2++){
if(arreglo[c2-1]>arreglo[c2]){
t1=arreglo[c2-1];
t2=arreglo[c2];
arreglo[c2-1]=t2;
arreglo[c2]=t1;
}
}
}

printf("\nOrdenado ascendentemente\n");

for(c=1;c<=cant;c++){
printf("arreglo[%d]= %d\n",c,arreglo[c]);

getch();

Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
42
16.- Funciones

Las funciones son un conjunto de instrucciones que realizan una tarea especfica, las
cuales normalmente toman unos valores de entrada, llamados parmetros y proporcionan un
valor de salida o valor de retorno. Las funciones son una de las caractersticas ms importante
de C, debido a que en estas se produce toda la actividad del programa y su objetivo es
subdividir los programas en varias tareas concurrentes.
Al igual que las variables, las funciones pueden declararse o definirse, en donde la
declaracin es simplemente una presentacin y la definicin contiene las instrucciones con las
cuales realizar su trabajo la funcin.

Otra caracterstica de las funciones es que sirve para realizar tareas concretas y simplificar el
programa, es decir, nos sirve para evitar tener que escribir el mismo cdigo varias veces.

La principal funcin en C es la llamada "main", y es la que indica de la funcin de entrada o
donde comienza el programa, siempre debe existir, y ser la que tome el control cuando se
ejecute un programa en C

Normalmente la funcin main no hace nada, es decir, en ella no se codifica la solucin del
problema, slo se encarga de llamar a otras funciones que implementan la solucin del
problema presentado.


Sintaxis:

tipo_de_variable nombre_de_la_funcin (argumentos)
{
definicin de variables;
cuerpo de la funcin;
return 0;
}




















Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
43
16.1. Ejercicios Resueltos Funciones

1.- Ejemplo de procedimiento














2.- Funcin con argumentos que no devuelve valores, en este ejemplo la
funcin compara toma dos nmeros, los compara y nos dice cual es mayor.

#include <stdio.h>
#include <conio.h>

void compara( int a, int b ) /* Metemos los parmetros a y b a la funcin */
{
if ( a>b )
printf( "%i es mayor que %i\n" , a, b );
else
printf( "%i es mayor que %i\n", b, a );
return;
}
int main( )
{
int num1, num2;
printf( "Introduzca dos nmeros: " );
scanf( "%i %i", &num1, &num2 );
compara( num1, num2 ); /*Llamamos a la funcin con 2 argumentos */
}











#include <stdio.h>
#include <conio.h>
void prepara_pantalla() /* No se debe poner punto y coma aqu */
{
clrscr();
printf( "La pantalla est limpia\n" );
return;
}
int main()
{
prepara_pantalla(); /* Llamamos a la funcin */
}

Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
44
3.- Funcin con argumento que devuelve un valor, este ejemplo devuelve como
resultado el mayor de los dos nmeros.

#include <stdio.h>
#include <conio.h>
int compara( int a, int b ) /* Metemos los parmetros a y b a la funcin */
{
int mayor;
if ( a>b )
mayor = a;
else
mayor = b;
return mayor;
}
int main()
{
int num1, num2;
int resultado;
printf( "Introduzca dos nmeros: " );
scanf( "%i %i", num1, num2 );
resultado = compara( num1, num2 );
/* Recogemos el valor que devuelve la funcin en resultado */
printf( "El mayor de los dos es %i\n", resultado );
}

4.- Programa realiza secuencia numrica desde 1 hasta N

#include <stdio.h>
#include <conio.h>

void numer(int final)
{ int c;
for(c=1;c<=final;c++)
{
printf("%d, ",c);
}
}
void main()
{
int f; //* valor final*//
clrscr();
printf("final : ");
scanf("%d",&f);
numer(f); //* realiza el conteo*//
getch();
}





Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
45
5.- Programa que calcula el rea de un triangulo.

#include <stdio.h>
#include <conio.h>
double triangulo(double base, double altura)
{
double area; //* definimos variables*//
area=(base*altura)/2; // * se evalua area*//
return area; //*regresa area*//
}

void main( )
{
int b,h;
clrscr();
printf ("Base: ");
scanf("%d",&b);
printf("Altura: ");
scanf("%d",&h);
printf("\nArea: %.2f",triangulo(b,h));
getch();
}


6.- Funcin que evala el rea de un trapecio

























#include <stdio.h>
#include <conio.h>
double trapecio(int BM, int Bm, int a)
{
return(((BM+Bm)*a)/2);
}
void main(){
clrscr();
int BaseMayor,BaseMenor,Altura;
printf("Base mayor: ");scanf("%d",&BaseMayor);
printf("Base menor: ");scanf("%d",&BaseMenor);
printf("Altura: ");scanf("%d",&Altura);
printf("\nArea: %.2f",trapecio(BaseMayor,BaseMenor,Altura));
getch();
}

Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
46
7.- Funcin que calcula el valor absoluto de un nmero



















8.- Funcin que calcula el volumen de un cubo



























#include <stdio.h>
#include <conio.h>
int absoluto(int n)
{
if(n<0)
n=n*-1;
return(n);
}

void main(){
clrscr();
int valor;
printf("Valor: ");
scanf("%d",&valor);
printf("Valor absoluto: %d",absoluto(valor));
getch();
}
#include <stdio.h>
#include <conio.h>

int cubo(int lado){
int vol;
vol=lado*lado*lado;
return vol;
}

void main(){
int lado;
clrscr();
printf("Lado: ");scanf("%d",&lado);
printf("\nVolumen: %d",cubo(lado));
getch();
}


Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
47
9.- Funcin que regresa el producto de dos argumentos























10.- Funcin que calcula la media de dos nmeros, con funcin

























#include <stdio.h>
#include <conio.h>
int a,b,c;
int producto(int a, int b);
main()
{
clrscr();
printf("Escriba un numero entre 1 y 100: ");
scanf("%d", &a);
printf("Escriba otro numero entre 1 y 100: ");
scanf("%d", &b);
c=producto(a,b);
printf("\n %d multiplicado por % d = %d",a,b,c);
getch();
return 0;
}
int producto(int a, int b)
{
return(a*b);
}

#include <stdio.h>
#include <stdlib.h>

int media(int a, int b)
{
return(a + b)/2;
}

void main()
{
int i, j;
int resp;
i = 7;
j = 9;

resp = media(i,j);
printf("La media de %d y %d es %d\n", i, j, resp);
exit(0);
}


Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
48
17.- Procedimientos

Los procedimientos son un grupo de instrucciones, variables, constantes, etc, que
estn diseados con un propsito particular y tiene su nombre propio, es decir un
procedimiento es un modulo de un programa que realiza tareas especificas y que no puede
regresar valores al programa principal u a otro procedimiento que lo este invocando.
Despus de escribir un procedimiento se usa su propio nombre como una sola instruccin o
llamada al procedimiento.

Un programa puede tener tantos procedimientos como se deseen, para hacer una llamada o
invocacin al procedimiento durante la ejecucin de un programa solo se deber escribir el
nombre del procedimiento y los parntesis en blanco.

Es importante destacar que la diferencia entre una funcin y un procedimiento est en los
valores que devuelven cada vez que son invocados, las funciones devuelven valores, y los
procedimientos no.

Todo procedimiento no regresa valores, sino que hace algo como por ejemplo ordenar,
imprimir, intercambiar valores, etc.

Sintaxis:
tipo_de_variable nombre_del_procedimiento (argumentos)
{
definicin de variables;
cuerpo del procedimiento;
}

17.1. Ejercicios Resueltos Procedimientos

1.- Procedimiento, en el cual se escribe un valor por pantalla.




















#include <stdio.h>
int maximo (int x, int y)
{ if (x>y )
return x ;
else
return y ;
}
void escribir (int r)
{
printf (El resultado es %d\n,r);
}
void main ()
{
int a,b;
int max;
printf (Escribe los nmeros:\n);
scanf (%d %d,&a,&b);
max = maximo (a,b);
escribir (max); }

Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
49

2.- Procedimiento en el cual se leen dos nmeros enteros y escribe el mayor de
ambos o un mensaje si son iguales.

#include <stdio.h>
void main ( )
{
int a,b;
printf("Dame dos nmeros... ");
scanf("%d%d",&a,&b);
if (a>b)
printf("El mayor numero es... %d",a);
else
if (b>a)
printf("El numero mayor es.... %d",b);
else
printf("Los nmeros son iguales");
}

3.- Procedimiento que lee un nmero entero y visualiza su tabla de multiplicar.

#include <stdio.h>
void main()
{
int a,b;
printf ("Introduce el nmero:");
scanf("%d",&a);
b=1;
while (b<=10)
{
printf("%d * %d = %d\n",a,b,a*b);
b=b+1;
}
}

4.- Procedimiento para calcular la suma de los enteros del 1 al 5

#include <stdio.h>
void main(void)
{
int i = 1, suma = 0;
while (i <= 5) { // se ejecuta el bloque mientras i<=5
suma += i; // equivale a suma=suma+i;
++i; // equivale a i=i+1;
}
printf("suma = %d\n", suma);
}



Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
50

5.- procedimiento que imprime todos los nmeros primos comprendidos entre el 2 y
un valor lmite que se preguntar al ejecutar el programa
#include <stdio.h>
void main(void)
{
int numero, divisor;
int n;
printf("Hasta qu nmero desea conocer los primos?\n");
printf("introduzca el valor: ");
scanf("%d", &n);
for (numero=2; numero<n; numero++) {
for (divisor=2; numero%divisor!=0; divisor++);
if (divisor == numero)
printf("%d\n", numero);
}
}


6.- Programa que imprime los 21 primeros nmeros y sus respectivos cuadrados de
tres formas distintas
# include <stdio.h>
void main(void)
{
int num=1;
while (num<21) {
printf("%10d %10d\n", num, num*num);
num = num + 1;
}
getchar();
num = 1;
while(num<21) {
printf("%10d %10d\n", num, num*num);
num += 1;
}
getchar();
num = 1;
while(num<21) {
printf("%10d %10d\n", num, num*num);
num++;
}
}









Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
51
18.- Recursividad

La recursividad se puede describir como una tcnica de programacin bastante
importante, la cual se utiliza para realizar una llamada a una funcin desde la misma funcin.
La recursividad no es que sea una forma fcil de resolver algoritmos, sino que hay
determinados algoritmos que se pueden resolver en forma ms eficazmente usando
recursividad.

Cuando un procedimiento o funcin es recursivo, este en ejecucin se llama directa o
indirectamente a s mismo, esta llamada depende al menos de una condicin que acta como
condicin de corte que provoca la finalizacin de la recursin.

Un algoritmo recursivo consta de las siguientes partes:
Al menos un caso trivial o base, es decir, que no vuelva a invocarse y que se ejecuta
cuando se cumple cierta condicin.
El caso general que es el que vuelve a invocar al algoritmo con un caso ms pequeo
del mismo.

La recursividad es un medio particularmente poderoso en las definiciones matemticas.

Que una funcin o procedimiento se llame a si mismo conlleva un peligro y es que, esta se
quede llamndose a si misma ms de lo esperado, provocando el temido volcamiento de pila,
claro esta que esto se produce por un mal diseo del algoritmo.

Funcionamiento de un algoritmo recursivo:
Se descompone el problema en problemas de menor complejidad (algunos de
ellos de la misma naturaleza que el problema original).
Se resuelve el problema para, al menos, un caso base.
Se compone la solucin final a partir de las soluciones parciales que se van
obteniendo.

18.1. Ejercicio Resueltos Recursividad

1.- Funcin factorial

Int factorial (int n)
{
int resultado;
if (n==0) //* Caso base *//
resultado = 1;
else //* Caso general *//
resultado = n*factorial(n-1);
return (resultado);
}







Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
52
2.- Rutina que saca potencia de un nmero

long potencia(int a, int b)
{
if (b<=0)
return 1;
else
return a*potencia(a,b-1);
}

3.- Programa que usa la recursividad para pasar un decimal a binario.

include <stdio.h>
#define DEBUG 0 // 1 aca para mostrar los ciclos de la
recursividad
int main(void)
{ int numero = 155;
int a,R;
printf("\nIngrese un numero para pasar a binario: ");
scanf("%d",& numero);
if(DEBUG == 0)
printf("Binario = ");
getchar();
return 0;
}
int DaB(int numero)
{ int a,R;
R = numero % 2;
a = numero / 2;
if(DEBUG != 0)
{ printf("a = %i\n",a);
fflush(stdout);
}

if (a > 0)
DaB(a);
if(DEBUG != 0)
{ printf("R = %d\n",R);
fflush(stdout);
}
else
printf("%d",R);
return 0;
}







Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
53
4.- Programa que muestra cmo se obtiene la suma desde un nmero hasta 1

#include<stdio.h>
#include<conio.c>
int sum(int num);
main()
{
int num;
clrscr();
printf("\nIngrese un numero:");
scanf("%d",&num);
printf("\nLa suma desde %d hasta 1 es: %d",num,sum(num));
getch();
}

int sum(int num)
{
int x,y;
if(num==0)
return (0);
x=num-1;
y=sum(x);
return(num+y);
}

5.- Programa que emplea una funcin recursiva como contador.

#include <stdio.h>
#include <conio.h>
void funcioncontadora(int x);
void main()
{
int indice = 9;
funcioncontadora(indice);
}
void funcioncontadora(int contador)
{
int contador;
contador--;
printf("El valor del contador es %d\n", contador);
if (contador > 0)
funcioncontadora(contador);
printf("Ahora el contador vale %d\n", contador);
}







Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
54
6.- Programa que mediante un mtodo recursivo, cuenta el numero de vocales de una
cadena.

#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <ctype.h>

void funcion(int i);
static int valores[3]; //en la posicion 0 cuento las vocales, en la 2 las consonantes....
int i=0;
char cadena[] = "En un lugAr de la ManchaAA...";
int main()
{
int n = strlen(cadena); //longitud de cadena
funcion(n);
printf("\nLa cadena contiene %d vocales....", valores[0]);
getch();
}
void funcion(int n)
{ while(i<n)
{
cadena[i]= toupper(cadena[i]); //convierte la letra a mayusculas
if((cadena[i]=='A')||(cadena[i]=='E')||(cadena[i]=='I')||(cadena[i]=='O')||(cadena[i]=='U'))
valores[0] += 1;
i++;
funcion(i); //llamada recursiva
}
}

7-. Funcin entera contar(N), la cual determina la cantidad total de dgitos que posee
N.

















Int div (int x, int N) {
If (N = = 0)
Return (0);
Else
Return (x + div (x, N/10));
}



Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
55
8.- Funcin raz digital(N) retornar la suma de los dgitos de N pero se detiene cuando
la suma da 1 digito









9.- Dado un arreglo de N nmeros enteros contar cuantos nmeros pares hay en el
arreglo

Int cuenta_pares (int a [], int n)
{ if n!=0
if (Es_Par(a [n-1] = = 0 )
return cuenta_pares (a,n-1) + 1;
else
return cuenta_pares (a,n-1);
else
return 0;
}
Int Es_Par (int h)
{ if (h % 2 = = 0)
return 0;
else
return 1;
}




















Int RD (int n)
{
If ((n / 10 = = )
return n;
dig = n% 10;
n = n / 10;
return (dig + rd (n) );
}

Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
56
10-.Torres de Hanoi en forma recursiva

















































Void hanoi (int m, int I, int j)
{ if (m = = 1)
printf(ficha de %d a %d \n, i , j);
else
{ hanoi (m 1, i , 6 i j );
printf( ficha de %d a %d \n , i , j );
hanoi (m -1 , 6 i j , j );
}
}

Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
57
19.- Recursividad v/s. Iteracin

Aspectos que hay que considerar al decidir cmo implementar la solucin a un
problema de forma iterativa o de forma recursiva:
La carga computacional (tiempo de CPU y espacio en memoria) asociada a las
llamadas recursivas.
La redundancia (algunas soluciones recursivas resuelven un problema en repetidas
ocasiones).
La complejidad de la solucin (en ocasiones, la solucin iterativa es muy difcil de
encontrar).
La concisin, legibilidad y elegancia del cdigo resultante de la solucin recursiva del
problema.

Ejemplos de su utilizacin:


1.- Calculo del trmino n de la sucesin de Fibonacci














2.- Dados dos nmeros a y b (nmero natural mayor o igual que cero) determinar a^b


















int fibon (int n){ int f;
if (n==1) /* condicin de parada */
{ f=1;
}
else
{ if (n==2) /* condicin de parada */
f=1;
}
else
{ f=fibon(n-1)+fibon(n-2); /* 2 llamadas recursivas */
return f;
}
int potencia(int a, int b)
{
if (b = = 0)
return 1;
else
return a * potencia(a, b-1);
}


Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
58
20.- Memoria Dinmica

Hasta ahora todos los tipos de datos predefinidos (enteros, reales, caracteres, bolanos)
y definidos por el usuario (enumerados, y estructuras de datos arrays y registros) han sido de
tipo esttico. Qu significa esto? Que su ubicacin y capacidad de almacenamiento quedan
rgidamente definidos desde el momento en que se declaran y no puede cambiar durante el
funcionamiento del programa. Esto tiene la ventaja obvia de ser muy fciles de localizar en la
memoria interna y tambin de simplificar y aligerar el cdigo de los programas ejecutables.

En cambio la memoria dinmica es un espacio de almacenamiento que se solicita en tiempo
de ejecucin de esta manera, a medida que el proceso va necesitando espacio para ms lneas,
va solicitando ms memoria al sistema operativo para guardarlas, como tambin podemos
liberara ese espacio de almacenamiento, en tiempo de ejecucin, cuando dejemos de
necesitarlo.

El medio para manejar la memoria que otorga el sistema operativo, es el puntero, puesto que
no podemos saber en tiempo de compilacin dnde nos dar espacios el sistema operativo (en
la memoria de nuestro PC). Con los punteros las cosas no cambian, estos son estticos. Una
variable de tipo puntero es una variable esttica, pero. . . la memoria a la que apuntan puede
que no.

Punteros
Un puntero es una variable esttica pero destinada a guardar direcciones de memoria
de otras variables.


Para explicar la memoria dinmica nos basaremos en los ejemplos a travs del lenguaje de
programacin en C por las cuales se necesitan estructuras donde nos permite cambiar el
tamao durante la ejecucin del programa.

La estructura de los datos esta compuesta de estructuras mas pequeas las cuales se
nominaran nodos o elementos, las cuales al agruparse contiene uno o mas punteros que
apuntan a un objeto del mismo nodo

Estructura bsica de un Nodo:
struct nodo
{
int dato;
struct nodo *nuevonodo;
};

El campo nuevonodo puede apuntar a un objeto del mismo tipo ya que al momento de
crearse construir una lista de datos de las cuales mantendrn un relacin con otros nodos, la
estructura del puntero a un nodo los representaremos de la siguiente manera.




Figura: estructura de un nodo

Dato

Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
59
Dependiendo del nmero de punteros y las relaciones entre nodos, se puede distinguir
distintos tipos de estructuras dinmicas, las cuales se detallan a continuacin.

Listas Simples:
Cada elemento (nodo), dispone de un puntero que apunta al siguiente elemento y el
valor del ltimo elemento ser null, solo se pueden recorrer hacia delante.

Listas Circulares Simples:
Es similar a las listas simples pero el ltimo elemento (nodo), apunta al primero y no
se puede indicar primer ni ultimo nodo ya que cualquiera puede ser nodo de entrada y
salida

Listas Doblemente Enlazadas:
Cada elemento (nodo), dispone de dos punteros, uno apunta al siguiente nodo y otro al
anterior, al contrario de las listas lineales estas pueden recorrerse en ambos sentidos.

Listas Circulares Dobles:
Similar a las LCS, este tipo de lista doble, el puntero izquierdo del primer nodo apunta
al ltimo nodo de la lista, y el puntero derecho del ltimo nodo apunta al primer nodo
de la lista.

Multilistas:
Una multi-lista es una lista de listas, en la cual existe un conjunto de nodos en que
algunos tienen ms de un puntero y pueden estar en ms de una lista simultneamente.

rboles:
En este tipo de estructura, cada elemento dispone de dos o ms punteros los cuales son
referidos a elementos anteriores, por lo cual la estructura crece igual que un rbol.























Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
60
21.- Listas Lineales Simples

La forma mas simple de una estructura es la Lista Lineal Simple, es en la cual sus
nodos se organizan de modo que cada uno apunta al siguiente y el ultimo no apunta a nada
por lo cual este vale Null
Existe un nodo que es el primero que llamaremos la cabeza de la lista, por el cual es el nico
que podemos acceder a toda la lista, cuando el puntero apunta a la lista y vale Null diremos
que la lista esta vaca.

A continuacin se indicara como construir un nodo tpico de la lista lineal Simple

struct nodo {
int dato;
struct nodo *siguiente;
};

Declaracin de listas en Lenguaje C;
Para efectuar la declaracin se definen varios tipos, ya que facilitan el manejo de la lista.

typedef struct _nodo {
int dato;
struct _nodo *siguiente;
} tipoNodo;
typedef tipoNodo *pNodo;

Donde:

- Tipo Nodo : Es el tipo para declarar nodos
- pNodo : Es el tipo para declarar punteros a un nodo


A continuacin graficaremos como puede verse una lista simple donde el primer elemento
apunta al siguiente lo cual nos indica que cualquier puntero a un nodo es una lista.

Lista








Es importante que nunca se pierda el valor del puntero del primer elemento ya que si se pierde
seria imposible ingresar al nodo y no se podra eliminar el espacio de memoria que es
utilizada por el nodo.




Dato Dato Dato NULL

Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
61
Operaciones Bsicas con LLS
a) Crear Lista.
b) Aadir o Insertar Elementos
c) Buscar o Localizar Elementos
d) Borrar Elementos
e) Moverse


a) Crear Lista
La forma de ingresar es muy simple y se realiza de la siguiente forma
1.- Nodo -> siguiente apunta a Null
2.-Lista apunta a Null








b) Aadir o Insertar Elementos
Insertar un elemento en la primera posicin:

Partiremos con un nodo el cual insertaremos, dicho nodo ser apuntado por un puntero
de una lista que no estar vaca.








El proceso para insertar el nodo se realiza de la siguiente manera.

1.- Nodo -> siguiente apunte a Lista
2.- Lista Apunte a Nodo













Lista Null

Nodo
Dato
Dato Dato
Dato
Lista 2
Nodo
1
Dato Dato
Dato
Lista
Nodo

Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
62
Inserta un elemento en la ltima posicin de la lista, en este caso partiremos con una
lista que no esta vaca









Los pasos para insertar el nodo es de la siguiente manera;

1.- Utilizaremos un puntero que apunte al ultimo elemento de la lista, la manera de
efectuarlo es empezar por el primer nodo y avanzar hasta el nodo que contenga el
valor Null
2.- Nodo -> siguiente sea Null
3.- Ultimo -> siguiente sea nodo









c) Localizar un Elemento en una lista simple
Para realizar este proceso se debe tener en cuenta que las listas simples solo se
recorren en un sentido ya que cada nodo apunta al siguiente, para recorrerla
utilizaremos un puntero auxiliar como ndice.

1.- Asignaremos el puntero ndice el valor de la lista
2.- Abriremos un Bucle que al menos debe tener una condicin, que el ndice no sea
Null
3.- Dentro del bucle asignaremos al ndice el valor del nodo siguiente al ndice actual







Dato Dato
Lista
Dato Dato
Ultimo
Dato
Nodo
Dato Dato
Lista
Dato Dato
Ultimo
Dato
Nodo
1
3
2
Null

Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
63
1.- muestra todos los valores de los nodos de una lista, podemos usar el siguiente bucle
en C:

typedef struct _nodo {
int dato;
struct _nodo *siguiente;
} tipoNodo;

typedef tipoNodo *pNodo;
typedef tipoNodo *Lista;
...
pNodo indice;
...
indice = Lista;
while(indice) {
printf("%d\n", indice->dato);
indice = indice->siguiente;}


2.- Supongamos que slo queremos mostrar los valores hasta que encontremos uno
que sea mayor que 100, podemos sustituir el bucle por:

indice = Lista;
while(indice && indice->dato <= 100) {
printf("%d\n", indice->dato);
indice = indice->siguiente;
}


Si analizamos la condicin del bucle, tal vez encontremos un posible error: Qu
pasara si ningn valor es mayor que 100, y alcancemos el final de la lista?. Podra
pensarse que cuando ndice sea NULL, si intentamos acceder a ndice->dato se
producir un error.
En general eso ser cierto, no puede accederse a punteros nulos. Pero en este caso, ese
acceso est dentro de una condicin y forma parte de una expresin "and".
Recordemos que cuando se evala una expresin "and", se comienza por la izquierda,
y la evaluacin se abandona cuando una de las expresiones resulta falsa, de modo que
la expresin "ndice->dato <= 100" nunca se evaluar si ndice es NULL.
Si hubiramos escrito la condicin al revs, el programa nunca funcionara bien. Esto
es algo muy importante cuando se trabaja con punteros.






Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
64
d) Borra Elementos
Eliminar el primer nodo de una lineal Simple:
Comenzaremos con una lista que contenga uno o ms nodos, y usaremos un puntero
auxiliar, nodo:




1.- Nodo apunta al primer elemento de la lista
2.- Asignamos a Lista la direccin del segundo nodo de la lista:
Lista->siguiente.
3.- Liberamos la memoria asignada al primer nodo, el que queremos eliminar.
Si no es guardado el puntero al primer nodo antes de actualizar Lista, despus nos
resultara imposible liberar la memoria que ocupa. Si liberamos la memoria antes de
actualizar la Lista perderemos el puntero al segundo nodo.



Si la lista slo tiene un nodo tambin se puede realizar ya que el valor Lista->siguiente
es NULL, y despus de eliminar el primer nodo la lista quedar vaca, y el valor de
Lista ser NULL.
Eliminar un nodo cualquiera de una lineal Simple:
En todos los dems casos, eliminar un nodo se puede hacer siempre del mismo modo.
Supongamos que tenemos una lista con al menos dos elementos, y un puntero al nodo
anterior al que queremos eliminar. Y un puntero auxiliar nodo.








Dato Dato
Lista
Nodo
Dato Dato
Lista
Nodo
1
3
2

Nodo Anterior
Dato Dato
Lista
Dato Dato

Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
65
El proceso es parecido al del caso anterior:
1. Nodo apunte al nodo que queremos borrar.
2. Ahora, asignamos como nodo siguiente del nodo anterior, el siguiente al que
queremos eliminar: anterior->siguiente = nodo->siguiente.
3. Eliminamos la memoria asociada al nodo que queremos eliminar.



Si el nodo a eliminar es el ltimo, el procedimiento es vlido, ya que anterior pasar a
ser el ltimo, y anterior->siguiente valdr NULL.
e) Moverse en una lista
Slo hay un modo de moverse a travs de una lineal Simple, hacia delante.
An as, a veces necesitaremos acceder a determinados elementos de una lineal
Simple.

Borrar una lista completa:

El algoritmo genrico para borrar una lista completa consiste simplemente en borrar el
primer elemento sucesivamente mientras la lista no est vaca.

21.1. Ejercicios Resueltos(LLS)

1.- Implementar una funcin que recibe una lista de enteros L y un nmero entero n de
forma que modifique la lista mediante el borrado de todos los elementos de la lista que
tengan este valor

void BorrarValor(Lista L,int n)
{
int aux;
Posicion p;

for(p=PrimeroLista(L);p!=FinLista(L);){
recuperar(&aux,p,L);
{ if (aux==n)
BorrarElemento(p,L);
else
p=Siguiente(p,L);
}
}





Dato Dato
Lista
Dato Dato
Nodo Anterior 1
3
2

Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
66
2.- Implementar una funcin Mezcla2 que tenga como parmetros dos listas de enteros
ordenados de menor a mayor y que devuelva una nueva lista como unin de ambas
con sus elementos ordenados de la misma forma.

Lista Mezcla2(Lista l1,Lista l2)
{
Lista L;
Posicion p1,p2;
int aux1,aux2;
/*En la lista L guardaremos el resultado*/
L=CrearLista(sizeof(int));
/*Utilizamos p1 y p2 para recorrer las dos listas*/
p1=PrimeroLista(l1);
p2=PrimeroLista(l2);
/*Obtenemos los elementos apuntados por p1 y p2 ,el menor*/
/*de ellos se inserta en el resultado y se adelanta en una*/
/*posicion.Se repite el proceso hasta que una lista queda */
/*sin elementos (cuando p1 o p2 llegan al final) */

while (p!=FinLista(l1)&& p2!=FinLista(l2)){
recuperar(&aux1,p1,l1);
recuperar(&aux2,p2,l2);
if (aux1 < aux2){
p1=Siguiente(p1,l1);
Insertar(&aux1,FinLista(L),L);
}
else{
p2=Siguiente(p2,l2);
Insertar(&aux2,FinLista(L),L);
}
}
/*Si p1 no ha llegado al final hay que vaciar l1 al final*/
/*de la lista resultado*/
while (p1!=FinLista(l1)){
recuperar(&aux1,p1,l1);
p1=Siguiente(p1,l1);
Insertar(&aux1,FinLista(L),L);
}
/*Si p2 no ha llegado al final hay que vaciar l2 al final*/
/*de la lista resultado*/
while (p2!=FinLista(l2)){
recuperar(&aux2,p2,l2);
p2=Siguiente(p2,l2);
Insertar(&aux2,FinLista(L),L);
}
/*Devolvemos L como resultado estando ya l1 y l2 vacias */
return L;
}



Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
67
3.- Construir una funcin que sume los elementos de una lista de enteros
recursivamente.
Para solucionar este problema vamos a construir una funcin que tenga como
parmetros de entrada una lista, una posicin inicial y una posicin final. Al llamar a
la funcin sobre la lista L podremos hacerlo mediante
Suma(L,PrimeroLista(L),FinLista(L)).El cdigo es el siguiente(ntese que no se
incluye en la suma el elemento sealado por la posicin final):

int Suma(Lista L,Posicion inicial,Posicion final)
{
int n;

if(inicial!=final)
{
recuperar(&n,inicial,L);
return n+Suma(L,Siguiente(inicial,L),final);
}
else return 0;
}

4.- Construir una funcin imprimeInverso que imprima los elementos de una lista
Simple de enteros en orden inverso a partir de una posicin p

Void imprimeInverso(Posicion p,Lista l)
{
int aux;
if(p!=FinLista(l))
{
imprimeInverso(Siguiente(p,l),l);
recuperar(&aux,p,l);
print("%d",aux);
}
}

5.- Escribir un procedimiento que escriba todos los elementos de una lista. Suponiendo
que para el elemento existe un procedimiento, escribe(x), que escribe un elemento de
dicho tipo.
void salida (tLista t)
{
tposicion p;
telemento x;

for (p = primero(l); p != fin(l); p = siguiente(p, l)){
x = elemento(p, l);
escribe(x);
}
}




Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
68
6.- Ejemplo de copia de una lista en otra:

tLista copia (tLista l)
{
tLista l2;
tPosicion p;

anula(&l2);
for (p=primero(l);p!=fin(l);p=siguiente(p,l))
insertar(elemento(p,l),fin(l2),l2);
return l2;
}

7.- Ejemplo de una funcin posicin, tiene que realizar una bsqueda lineal en un
vector. En caso de que el elemento considerado no est en el vector, esta funcin debe
devolver lo mismo que fin(l).

tPosicion posicion (tElemento x, tLista l)
{
tPosicion q;
int encontrado;

q = encontrado = 0;
while ((q <= l->n) && (!encontrado)) {
if (l->elementos[q] == x)
encontrado=1;
else q++;
};
return q;
}










Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
69
8.- Como ejemplo mostramos una funcin que guarda en una lista los nmeros enteros
del 0 al 9, despus la recorre eliminando los impares y por ltimo escribe el resultado
dos veces, desde el primer elemento al ltimo y desde el ltimo al primero:

void EJEMPLO ()
{
int a;
tLista l;
tPosicion p;

l = crear(10);
for (a=0; a<10; a++)
insertar(a, primero(l), l);
for (p=primero(l); p!=fin(l); ) {
a = elemento(p,l);
if (a%2)
borrar(p,l);
else
p = siguiente(p,l);
}
for (p=primero(l); p!=fin(l); p=siguiente(p,l)) {
a = elemento(p,l);
printf("Elemento: %d \n",a);
}
printf(" \n \n ");
for (p=fin(l); p!=primero(l); p=anterior(p,l)) {
a = elemento(anterior(p,l), l);
printf("Elemento: %d \n",a);
}
destruir(l);
}
















Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
70
9.- Usando las operaciones del TAD lista, escribir una funcin void particiona
(list<int> &L, int a) la cual, dada una lista de enteros L, reemplace aquellos que son
mayores que a por una sucesin de elementos menores o iguales que a pero
manteniendo la suma total constante.

void particiona (list<int> &L, int a) {
list <int>; iterator p;
int x;
p = L.begin();
while (p != L.end()) {

x=*p;
if (x>a) {
p=L.erase(p)
while (x>a) {
p=L.insert(p, a);
p++;
x=x-a;
}
if (x>0) {p=L.insert(p,x); p++;}}
else
p++;
}

10.- Mejores(C,L) que genera una lista L (LLS) con todos los nombres de los autos
que obtuvieron el mejor rendimiento promedio de la prueba.

Void mejores(enlace C,enlace *L)
{ enlace p;q;
p=mayor (c)
abrir (&c);
q = *c;
while =! Null
{ if (q->info=p->info)
{agregar (q->info,&L)}
q=q->prox;
}
return(c);
}







Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
71
22.- Listas Circulares Simples

Las listas circulares es una listas lineal en la cual el ultimo nodo esta apuntando al
primero y cada uno de estos siempre tiene un nodo anterior y uno siguiente
El formato para la creacin de una lista circular es la misma declaracin que la lista simple

struct nodo {
int dato;
struct nodo *siguiente;
};
typedef struct _nodo {
int dato;
struct _nodo *siguiente;
} tipoNodo;
typedef tipoNodo *pNodo;
typedef tipoNodo *Lista;

Donde:

tipoNodo : es el tipo para declarar nodos, evidentemente.
pNodo : es el tipo para declarar punteros a un nodo.














Dato Dato
Lista
Dato Dato

Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
72
- Operaciones bsicas con listas circulares

Aadir un Elemento
El nodo que ya fue creado e insertaremos este apuntado con un puntero y este tendr el valor
Null



El procedimiento es el siguiente
1. La lista apunta al nodo
2. lista->siguiente apunte a nodo



Aadir elemento en una lista circular no vaca:
De nuevo partiremos de un nodo a insertar, con un puntero que apunte a l, y de una lista, en
este caso, el puntero no ser nulo:



El proceso sigue siendo muy sencillo:
1. Hacemos que nodo->siguiente apunte a lista->siguiente.
2. Despus que lista->siguiente apunte a nodo.






Lista Null

Nodo
Dato
Lista
Dato
Nodo
2
1
Dato Dato
Lista
Dato
Nodo
Dato Dato
Lista
Dato
Nodo
1
2

Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
73
Aadir elemento en una lista circular:
Para generalizar los dos casos anteriores, slo necesitamos aadir una operacin:
1. Si lista est vaca hacemos que lista apunte a nodo.
2. Si lista no est vaca, hacemos que nodo->siguiente apunte a lista->siguiente.
3. Despus que lista->siguiente apunte a nodo.
Eliminar un elemento de una lista circular:
Para sta operacin podemos encontrar tres casos diferentes:
1. Eliminar un nodo cualquiera, que no sea el apuntado por lista.
2. Eliminar el nodo apuntado por lista, y que no sea el nico nodo.
3. Eliminar el nico nodo de la lista.
En el primer caso necesitamos localizar el nodo anterior al que queremos borrar. Como el
principio de la lista puede ser cualquier nodo, haremos que sea precisamente lista quien
apunte al nodo anterior al que queremos eliminar.
Esto elimina la excepcin del segundo caso, ya que lista nunca ser el nodo a eliminar, salvo
que sea el nico nodo de la lista.
Una vez localizado el nodo anterior y apuntado por lista, hacemos que lista->siguiente apunte
a nodo->siguiente. Y a continuacin borramos nodo.
En el caso de que slo exista un nodo, ser imposible localizar el nodo anterior, as que
simplemente eliminaremos el nodo, y haremos que lista valga NULL.
Eliminar un nodo en una lista circular con ms de un elemento:
Consideraremos los dos primeros casos como uno slo.



1. El primer paso es conseguir que lista apunte al nodo anterior al que queremos
eliminar. Esto se consigue haciendo que lista valga lista->siguiente mientras lista-
>siguiente sea distinto de nodo.
2. Hacemos que lista->siguiente apunte a nodo->siguiente.
3. Eliminamos el nodo.



Dato Dato
Lista
Dato Dato
Nodo
Dato Dato
Lista
Dato Dato
Nodo
1 3
2

Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
74
22.1. Ejercicios Resueltos (LCS)

1.- En una lista c (LCD), su campo info, contiene solo dgitos de 0 a 9. Escribir el
operado PAL, que forma dos nmeros con los dgitos de c, uno recorriendo la lista en
sentido horario y el otro en sentido antihorario, PAL retornara verdadero si ambos
nmeros son idnticos , falso en caso contrario, adems si c esta vaca PAL retornara
verdadero.

Int Pal(lista c)
enlace p = c;
int p = 1, num = 0, inv = 0 ;
if (p != Null)
{ p -> prev -> prox = null;
p -> prev = null;
while (p != Null)
{ num + =(p ->info)* p;
p * = 10;
p = p -> prox;
}
}
inv = inverter(num);
if (num = inv)
{ return 1;
else
return 0;
}

2.- Se tienen dos listas circulares dobles, una con exponentes y otra con coeficientes,
el siguiente operador mezclar une en una sola lista los coeficientes y sus exponentes.

Void mezclar (lcs* p, lcs* c, lcs*e)
{ enlace = ac, ae, bc, be, cc, ce;
ac = *c;
ae = *e,
bc = *c;
be = *e;
cc = bc -> link;
ce = be -> link;
while(cc != ac // ce != ae)
{ *p = bc;
*p -> link = be,
bc = bc -> link;
be = bc -> link;
cc = bc -> link;
ce = be -> link,
*p -> link = ac;
}




Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
75
En una LCD C, no vaca, estn almacenados todos los datos incluidos el promedio del
rendimiento, de una serie de vehculos testeados en una prueba de laboratorio. La prueba
arrojo un ndice para cada automvil, que varia entre 0 y 1, escriba los siguientes operadores

3-. Mayor (c) que retorna un puntero al nodo del auto con mejor promedio de
rendimiento.
Enlace mayor (enlace c)
{ enlace p; q;
p= cprox;
q=c;
while (p!=c)
{ if (qinfo < pinfo)
{q=p;
p= pprox;
}
if (qinfo < pinfo)
q = p;
return q;
}


4-. ndice (c) que retorna el mayor promedio testeado

Float indice (enlace c)
{ enlace p;
p= mayor (c) ;
return pinfo;
}























Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
76
23.- Listas Lineal Doblemente Enlazada
En una lista doblemente enlazada, cada elemento contiene dos punteros, aparte del
valor almacenado en el elemento, un puntero apunta al siguiente elemento de la lista (sig) y el
otro puntero apunta al electo anterior de la lista (ant).



Declaracin de una lista lineal Doble
typedef struct _nodo {
int dato;
struct _nodo *siguiente;
struct _nodo *anterior;
} tipoNodo;

typedef tipoNodo *pNodo;
typedef tipoNodo *Lista;

Donde:
tipoNodo : es el tipo para declarar nodos, evidentemente.
pNodo : es el tipo para declarar punteros a un nodo.

Insercin de un elemento:

Para insertar o aadir un elemento variara dependiendo de la posicin en que se desea insertar
el electo, ya que puede ser en la cabeza (primer elemento) de la lista o bien en algun otro
lugar de la lista, los cuales se pasaran a detallar a continuacin:

Insercin en la cabeza de la lista
Partimos de una lista no vaca. Para simplificar, consideraremos que lista apunta al primer
elemento de la lista doblemente enlazada:






Dato
Lista
Dato Dato Dato
Null
Null
Dato
Lista
Dato Dato
Nodo
Null

Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
77
El proceso es el siguiente:
1. nodo->siguiente debe apuntar a Lista.
2. nodo->anterior apuntar a Lista->anterior.
3. Lista->anterior debe apuntar a nodo.




Recuerda que Lista no tiene por qu apuntar a ningn miembro concreto de una lista
doblemente enlazada, cualquier miembro es igualmente vlido como referencia.

Insertar un elemento a continuacin de un nodo cualquiera de una lista:
Bien, este caso es ms genrico, ahora partimos de una lista no vaca, e insertaremos un nodo
a continuacin de uno nodo cualquiera que no sea el ltimo de la lista:



El proceso sigue siendo muy sencillo:
1. Hacemos que nodo->siguiente apunte a lista->siguiente.
2. Hacemos que Lista->siguiente apunte a nodo.
3. Hacemos que nodo->anterior apunte a lista.
4. Hacemos que nodo->siguiente->anterior apunte a nodo.





Lo que se a realizado es trabajar como si tuviramos dos listas enlazadas, los dos primeros
pasos equivalen a lo que se realizaba para insertar elementos en una lineal Simple corriente.
Dato
Lista
2
Dato Dato
Nodo
Null
3
1
Dato
Lista
Dato Dato Dato
Null
Null
Dato
Nodo
Dato
Lista
Dato Dato Dato
Null
Null
Dato
Nodo
2
4
3 1

Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
78
A continuacin pasaremos a detallar algunas formas de eliminar un nodo en una lista
doblemente enlazada
Eliminar el nico nodo de una lista doblemente enlazada.
En este caso, ese nodo ser el apuntado por Lista.



1. Eliminamos el nodo.
2. Hacemos que Lista apunte a NULL.



Eliminar el primer nodo de una lista doblemente enlazada:
Pueden ocurrir dos casos posibles, que el nodo a borrar est apuntado por Lista o que no. Si lo
est, simplemente hacemos que Lista sea Lista->siguiente.


1. Nodo apunta a Lista, hacemos que Lista apunte a Lista->siguiente.
2. Hacemos que nodo->siguiente->anterior apunte a NULL
3. Borramos el nodo apuntado por nodo.



Eliminar el ltimo nodo de una lista doblemente enlazada:
De nuevo tenemos los dos casos posibles, que el nodo a borrar est apuntado por Lista o que
no. Si est apuntado simplemente hacemos que Lista sea Lista->anterior.


Lista
Dato
Null Null
Lista
Dato
Null Null
1
2
Null
Lista
Dato Dato
Null
Nodo
Lista
Dato Dato
Null
Null
3
1
2
Nodo
Lista
Dato Dato
Null
Nodo

Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
79
1. Si nodo apunta a Lista, hacemos que Lista apunte a Lista->anterior.
2. Hacemos que nodo->anterior->siguiente apunte a NULL
3. Borramos el nodo apuntado por nodo.



Eliminar un nodo intermedio de una lista doblemente enlazada:
De nuevo tenemos los dos casos posibles, que el nodo a borrar est apuntado por Lista o que
no. Si lo est, simplemente hacemos que Lista sea Lista->anterior o Lista->siguiente. Se trata
de un caso ms general de los dos casos anteriores..



1. Nodo apunta a Lista, hacemos que Lista apunte a Lista->anterior (o Lista->siguiente).
2. Hacemos que nodo->anterior->siguiente apunte a nodo->siguiente.
3. Hacemos que nodo->siguiente->anterior apunte a nodo->anterior.
4. Borramos el nodo apuntado por nodo.












Lista
Dato Dato
Null
3
1
2
Nodo
Nodo
Dato
Lista
Dato Dato Dato
Null
Null
2
4
3
Nodo
Dato
Lista
Dato Dato Dato
Null
Null
1

Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
80
23.1. Ejercicios Resueltos (LLD)
1.- Un procedimiento para borrar un elemento en la posicin p en una lista doblemente
enlazada es:
void borrar (posicion p)
{
if (p->anterior != NULL)
p->anterior->siguiente = p->siguiente;
if (p->siguiente != NULL)
p->siguiente->anterior = p->anterior;
free(p);
}


2.- Un procedimiento para crear una lista

tLista Crear()
{
tLista l;
l = (tLista)malloc(sizeof(tipocelda));
if (l == NULL)
Error("Memoria insuficiente.");
l->siguiente = l->anterior = l;
return l;
}

3.- Un procedimiento para destruir una lista

void Destruir (tLista l)
{
tPosicion p;

for (p=l, l->anterior->siguiente=NULL; l!=NULL;
p=l) {
l = l->siguiente;
free(p);
}
}












Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
81
4.- Procedimiento Insertar elemento x en una lista
void Insertar (tElemento x, tPosicion p, tLista l)
{
tPosicion nuevo;

nuevo = (tPosicion)malloc(sizeof(tipocelda));
if (nuevo == NULL)
Error("Memoria insuficiente.");
nuevo->elemento = x;
nuevo->siguiente = p;
nuevo->anterior = p->anterior;
p->anterior->siguiente = nuevo;
p->anterior = nuevo;
}


5.- Procedimiento que intercala los nodos de las LLD l y p

Void intercalar(LLD *l,LLD *p)
{
LLD i,p;
Enlace q;
Q = *p;
While ((*l) -> prox !=null)
{
Q ->prox ->prev =i;
Q -> q ->prox;
i ->prox ->prev =q;
i=I ->prox;
}
While (I -> prev != null)
{
I ->prev ->prox =i;
I =I ->prev;
}
I -> prev =p;
P ->prox =I;
}












Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
82
6.- Bsqueda y borrado de un elemento de la lista

void Borrar (tPosicion *p, tLista l)
{
tPosicion q;

if (*p == l){
Error("Posicion fin(l)");
}
q = (*p)->siguiente;
(*p)->anterior->siguiente = q;
q->anterior = (*p)->anterior;
free(*p);
(*p) = q;
}
tElemento elemento(tPosicion p, tLista l)
{
if (p = = l)
{


7.- Agregar nodo cabecera en una LLD


void agregar_nodo_cabecera (LLD *L)
{ enlace p;
*Lprev = malloc(ziseof(nodo));
*Lprevprox=*L;
*L=*Lprev;
*Lprev=null;
}



Se define una lista jaiba a aquella lista lineal de doble enlace en donde el primero y el
ultimo nodo se apuntan a si mismo.

8.- Escriba el operador Eliuit (L), que permita eliminar el ultimo nodo de la lista jaiba
L,sin alterar su caracteristica de jaiba.

void eliuit (enlace *L)
{
if(*L!= null)
{
if (*L)prox =*L)
Free (*L);
}
else
eliuit (&(*L)prox))
}


Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
83

9.- Escriba el operador agregar ini (L,e), que permita agregar un nuevo nodo al
comienzo de la lista jaiba L con informacion e.

void agregar ini (enlace*L , int e)
{ enlace q;
q=enlace malloc (sizeof q (nodo);
qinfo=e;
qprox=*L;
if (*L!= null)
{*Lprev=q;
}
*L=q;
}
























Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
84
24.- Multilistas

Una multi-lista es una lista de listas, en la cual se puede almacenar la informacin que
se necesite.
Una multilista es una lista generalizada cuyos elementos pueden ser tomos o multilistas. Por
ejemplo, si M =( 1 2 ( 3 4 ( 5 ) 6 ) 7 8 ) es una multilista, entonces M consta de cinco
elementos: los tomos 1, 2, 7, 8 y la multilista ( 3 4 ( 5 ) 6 ) la cual, a su vez, consta de cuatro
elementos.

Caractersticas:
Conjunto de nodos en que algunos tienen ms de un puntero y pueden estar en ms de
una lista simultneamente.
Para cada tipo de nodo es importante distinguir los distintos campos punteros para
realizar los recorridos adecuados y evitar confusiones.

Figura: Ejemplo grafico de una Multilista

Figura: Ejemplo grafico de la estructura de un nodo en multiliastas




Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
85
24.1. Ejercicios Resueltos Multilistas
1.- Funcin contar, que retorna la cantidad de tomos del nivel mas bajo de una
musltilista.
int contar(mlista L, int k)
{ if ( L != null)
{ if (L atomo)
{ if k = = 0;
return 1 + contar(L link, k)
else
return contar(L link, k)
}
else
return contar(L var.next, k-1) + contar(L link, k)
}
}
2.- Funcin sumar, que retorma la suma de los datos de los nodos del nivel mas bajo
de una multilista.
int sumar(mlista L, int k)
{ if ( L != null)
{ if (L atomo)
{ if k = = 0;
return Lvar.dato + contar(L link, k)
else
return contar(L link, k)
}
else
return contar(L var.next, k-1) + contar(L link, k)
}
}


















Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
86
3.- Funcin suma total(M,K) que calcula la suma de los valores reales contenidos en la
multilista M, que sean mayores que K, estos nodos deben ser al mismo tiempo
eliminados de la multilista.

int sumatotal(mlista L, int k)
{ if ( L != null)
{ if (L atomo)
{ if (k < L var.dato)
aux = L var.dato;
elimina(&L);
return aux + sumatotal(&L link, k);
else
return sumatotal(&L link, k);
}
else
return sumatotal(L var.next, k) + sumatotal(&L link, k)
}
}

4.- Funcin que suma los tomos de una multilista.

int suma_atomo(mlista m)
{ if ( *m != null)
{ if (L atomo)
return 1 + suma_atomo(m link);
else
return suma_atomo(m link);
}
else
return 0;
}

5.- Procedimiento reducir(M) que reemplaza cada cabecera de sublista por la suma
total de los tomos que la forman.

void reducir(mlista *m)
{ if ( *m != null)
{ if (L atomo)
*m var.dato = suma_atomo(m var.next);
reducir(&m var.next);
reducir(&m link);
}
}








Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
87
6.- Operador total que calcula la suma de los valores enteros almacenados en una
multilista M, conjuntamente con la acumulacin del resultado, se deber ir eliminando
cada uno de los nodos de manera que al finalizar la operacin, la multilista M haya
desaparecido completamente.

int total(mlista *M)
{ if ( *M != null)
{ if (*M atomo)
return (total(*Mlink) + *Mvar.dato);
free(*M);
*M = null;
}
else
return (total(*Mvar.next));
return (total*Mlink);
}

7.- Procedimiento que lista todos los elementos de un nivel N en una multilista M. Se
supone que el nodo cabecera de la multilista es el nivel 0.

viod listar(mlista M, int N)
{ if ( N >= 0)
{ if (M atomo)
printf(%d, Mvar.dato);
listar(mlink, N);
else
listar(Mvar.next, N-1);
listar(Mlink, N);
}
}

8.- Procedimiento replace que reemplaza todas las ocurrencias del tomo A por la
sublista S en la multilista M.

viod replace(mlista *M, int A)
{ if ( *M != null)
{ if (*M atomo)
{ if (*Mvar.dato = = A)
*M atomo = 0;
*M var.dato = null;
*M var.next = S;
}
replace(&Mlink, A, S);
else
replace(&Mvar.next, A, S);
replace(&Mlink, A, S);
}
}



Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
88
25.- rboles

Un rbol es una estructura no lineal en la que cada nodo puede apuntar a uno o varios
nodos.
Tambin se suele dar una definicin recursiva: un rbol es una estructura en compuesta por un
dato y varios rboles.
Esto son definiciones simples. Pero las caractersticas que implican no lo son tanto.







Definiremos varios conceptos. En relacin con otros nodos:
Nodo hijo: cualquiera de los nodos apuntados por uno de los nodos del rbol. En el
ejemplo, 'L' y 'M' son hijos de 'G'.
Nodo padre: nodo que contiene un puntero al nodo actual. En el ejemplo, el nodo 'A'
es padre de 'B', 'C' y 'D'.
Los rboles con los que trabajaremos tienen otra caracterstica importante: cada nodo slo
puede ser apuntado por otro nodo, es decir, cada nodo slo tendr un padre. Esto hace que
estos rboles estn fuertemente jerarquizados, y es lo que en realidad les da la apariencia de
rboles.
En cuanto a la posicin dentro del rbol:
Nodo raz: nodo que no tiene padre. Este es el nodo que usaremos para referirnos al
rbol. En el ejemplo, ese nodo es el 'A'.
Nodo hoja: nodo que no tiene hijos. En el ejemplo hay varios: 'F', 'H', 'I', 'K', 'L', 'M',
'N' y 'O'.
Nodo rama: aunque esta definicin apenas la usaremos, estos son los nodos que no
pertenecen a ninguna de las dos categoras anteriores. En el ejemplo: 'B', 'C', 'D', 'E',
'G' y 'J'.

Otra caracterstica que normalmente tendrn nuestros rboles es que todos los nodos
contengan el mismo nmero de punteros, es decir, usaremos la misma estructura para todos
los nodos del rbol. Esto hace que la estructura sea ms sencilla, y por lo tanto tambin los
programas para trabajar con ellos.
A
B C D
E F G H
L K
J I
O N M

Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
89
Tampoco es necesario que todos los nodos hijos de un nodo concreto existan. Es decir, que
pueden usarse todos, algunos o ninguno de los punteros de cada nodo.
Un rbol en el que en cada nodo o bien todos o ninguno de los hijos existe, se llama rbol
completo.
En una cosa, los rboles se parecen al resto de las estructuras que hemos visto: dado un nodo
cualquiera de la estructura, podemos considerarlo como una estructura independiente. Es
decir, un nodo cualquiera puede ser considerado como la raz de un rbol completo.
Existen otros conceptos que definen las caractersticas del rbol, en relacin a su tamao:
Orden: es el nmero potencial de hijos que puede tener cada elemento de rbol. De
este modo, diremos que un rbol en el que cada nodo puede apuntar a otros dos es de
orden dos, si puede apuntar a tres ser de orden tres, etc.
Grado: el nmero de hijos que tiene el elemento con ms hijos dentro del rbol. En el
rbol del ejemplo, el grado es tres, ya que tanto 'A' como 'D' tienen tres hijos, y no
existen elementos con ms de tres hijos.
Nivel: se define para cada elemento del rbol como la distancia a la raz, medida en
nodos. El nivel de la raz es cero y el de sus hijos uno. As sucesivamente. En el
ejemplo, el nodo 'D' tiene nivel 1, el nodo 'G' tiene nivel 2, y el nodo 'N', nivel 3.
Altura: la altura de un rbol se define como el nivel del nodo de mayor nivel. Como
cada nodo de un rbol puede considerarse a su vez como la raz de un rbol, tambin
podemos hablar de altura de ramas. El rbol del ejemplo tiene altura 3, la rama 'B'
tiene altura 2, la rama 'G' tiene altura 1, la 'H' cero, etc.

Los rboles de orden dos son bastante especiales, de hecho les dedicaremos varios captulos.
Estos rboles se conocen tambin como rboles binarios.
Frecuentemente, aunque tampoco es estrictamente necesario, para hacer ms fcil moverse a
travs del rbol, aadiremos un puntero a cada nodo que apunte al nodo padre. De este modo
podremos avanzar en direccin a la raz, y no slo hacia las hojas.
Es importante conservar siempre el nodo raz ya que es el nodo a partir del cual se desarrolla
el rbol, si perdemos este nodo, perderemos el acceso a todo el rbol.
El nodo tpico de un rbol difiere de los nodos que hemos visto hasta ahora para listas, aunque
slo en el nmero de nodos. Veamos un ejemplo de nodo para crear rboles de orden tres:
struct nodo {
int dato;
struct nodo *rama1;
struct nodo *rama2;
struct nodo *rama3;
};




Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
90
Declaraciones de tipos para manejar rboles en C:
Para C, y basndonos en la declaracin de nodo que hemos visto ms arriba, trabajaremos con
los siguientes tipos:

typedef struct _nodo {
int dato;
struct _nodo *rama[ORDEN];
} tipoNodo;

typedef tipoNodo *pNodo;
typedef tipoNodo *Arbol;

Al igual que hicimos con las listas que hemos visto hasta ahora, declaramos un tipo tipoNodo
para declarar nodos, y un tipo pNodo para es el tipo para declarar punteros a un nodo.

rbol es el tipo para declarar rboles de orden ORDEN.










Operaciones bsicas con rboles:

Recorridos por rboles:

El modo evidente de moverse a travs de las ramas de un rbol es siguiendo los punteros, del
mismo modo en que nos movamos a travs de las listas.
Esos recorridos dependen en gran medida del tipo y propsito del rbol, pero hay ciertos
recorridos que usaremos frecuentemente. Se trata de aquellos recorridos que incluyen todo el
rbol.
Hay tres formas de recorrer un rbol completo, y las tres se suelen implementar mediante
recursividad. En los tres casos se sigue siempre a partir de cada nodo todas las ramas una por
una.










DATO
DATO DATO
DATO DATO DATO

Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
91
Supongamos que tenemos un rbol de orden tres, y queremos recorrerlo por completo.

Partiremos del nodo raz:

RecorrerArbol(raiz);

La funcin RecorrerArbol, aplicando recursividad, ser tan sencilla como invocar de nuevo a
la funcin RecorrerArbol para cada una de las ramas:

void RecorrerArbol(arbol a)
{
if(a == NULL) return;
RecorrerArbol(a->rama[0]);
RecorrerArbol(a->rama[1]);
RecorrerArbol(a->rama[2]);
}
Lo que diferencia los distintos mtodos de recorrer el rbol no es el sistema de hacerlo, sino el
momento que elegimos para procesar el valor de cada nodo con relacin a los recorridos de
cada una de las ramas.














Los tres tipos son:
1) Pre-orden:

En este tipo de recorrido, el valor del nodo se procesa antes de recorrer las ramas:

void PreOrden(arbol a)
{
if(a == NULL) return;
Procesar(dato);
RecorrerArbol(a->rama[0]);
RecorrerArbol(a->rama[1]);
RecorrerArbol(a->rama[2]);
}
Si seguimos el rbol del ejemplo en pre-orden, y el proceso de los datos es sencillamente
mostrarlos por pantalla, obtendremos algo as:

A B E K F C G L M D H I J N O
A
B C D
E F G H
L K
J I
O N M

Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
92
2) In-orden:

En este tipo de recorrido, el valor del nodo se procesa despus de recorrer la primera rama y
antes de recorrer la ltima. Esto tiene ms sentido en el caso de rboles binarios, y tambin
cuando existen ORDEN-1 datos, en cuyo caso procesaremos cada dato entre el recorrido de
cada dos ramas (este es el caso de los rboles-b):

void InOrden(arbol a)
{
if(a == NULL) return;
RecorrerArbol(a->rama[0]);
Procesar(dato);
RecorrerArbol(a->rama[1]);
RecorrerArbol(a->rama[2]);
}

Si seguimos el rbol del ejemplo en in-orden, y el proceso de los datos es sencillamente
mostrarlos por pantalla, obtendremos algo as:

K E B F A L G M C H D I N J O

3) Post-orden:

En este tipo de recorrido, el valor del nodo se procesa despus de recorrer todas las ramas:

void PostOrden(arbol a)
{
if(a == NULL) return;
RecorrerArbol(a->rama[0]);
RecorrerArbol(a->rama[1]);
RecorrerArbol(a->rama[2]);
Procesar(dato);
}

Si seguimos el rbol del ejemplo en post-orden, y el proceso de los datos es sencillamente
mostrarlos por pantalla, obtendremos algo as:

K E F B L M G C H I N O J D A













Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
93
Eliminar nodos en un rbol:

El proceso general es muy sencillo en este caso, pero con una importante limitacin, slo
podemos borrar nodos hoja.

El proceso sera el siguiente:
1. Buscar el nodo padre del que queremos eliminar.
2. Buscar el puntero del nodo padre que apunta al nodo que queremos borrar.
3. Liberar el nodo.
4. padre->nodo[i] = NULL;.
Cuando el nodo a borrar no sea un nodo hoja, diremos que hacemos una "poda", y en ese caso
eliminaremos el rbol cuya raz es el nodo a borrar. Se trata de un procedimiento recursivo,
aplicamos el recorrido PostOrden, y el proceso ser borrar el nodo.
El procedimiento es similar al de borrado de un nodo:
1. Buscar el nodo padre del que queremos eliminar.
2. Buscar el puntero del nodo padre que apunta al nodo que queremos borrar.
3. Podar el rbol cuyo padre es nodo.
4. padre->nodo[i] = NULL;.

En el rbol del ejemplo, para podar la rama 'B', recorreremos el subrbol 'B' en postorden,
eliminando cada nodo cuando se procese, de este modo no perdemos los punteros a las ramas
apuntadas por cada nodo, ya que esas ramas se borrarn antes de eliminar el nodo.
De modo que el orden en que se borrarn los nodos ser:

K E F y B

Existen varios tipos de rboles ordenados, que veremos a continuacin:
rboles binarios de bsqueda (ABB): son rboles de orden 2 que mantienen una
secuencia ordenada si se recorren en inorden.
rboles AVL: son rboles binarios de bsqueda equilibrados, es decir, los niveles
de cada rama para cualquier nodo no difieren en ms de 1.
rboles perfectamente equilibrados: son rboles binarios de bsqueda en los que el
nmero de nodos de cada rama para cualquier nodo no difieren en ms de 1. Son
por lo tanto rboles AVL tambin.
rboles 2-3: son rboles de orden 3, que contienen dos claves en cada nodo y que
estn tambin equilibrados. Tambin generan secuencias ordenadas al recorrerlos
en inorden.
rboles-B: caso general de rboles 2-3, que para un orden M, contienen M-1 claves.




Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
94
25.1. Ejercicios Resueltos rboles

1.- Procedimiento listar en pre-orden

void listar(arbol T)
{ if ( T != null)
{ printf(d%, Tinfo);
listar(T izq);
listar(T der);
}
}

2.- Procedimiento listar en pos-orden

void listar(arbol T)
{ if ( T != null)
listar(T izq);
listar(T der);
{ printf(d%, Tinfo);
}
}

3.- Procedimiento listar en orden

void listar(arbol T)
{ if ( T != null)
listar(T izq);
{ printf(d%, Tinfo);
}
listar(T der);
}

4.- Funcin que cuenta los nodos pares de un rbol.

int cuenta_pares(arbol T)
{ if (T != null)
{if (T info %2) = = 0;
return 1 + cuenta_pares(T izq) + cuenta_pares(T der);
else
return cuenta_pares(T izq) + cuenta_pares((T der);
}
else
return 0;
}







Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
95
5.- Funcin que cuenta la cantidad de nodos internos de un rbol.

int cuenta_nodos_int(arbol T)
{ if (T != null)
{if (T izq != T der)
return 1 + cuenta_nodos_int(T izq) + cuenta_nodos_int(T der);
else
return cuenta_nodos_int(T izq) + cuenta_nodos_int((T der);
}
else
return 0;
}

6.- Procedimiento que verifica si el rbol es completo

void completo(arbol T)
int cant_hojas;
int tamao;
cant_hojas = cuenta_hojas(T);
tamao = altura(T);
{ if cont_hojas = = ( 2 ^ tamao)
printf(el arbol es completo);
else
printf(el arbol no es completo),
}

7.- Procedimiento duplicar, el cual genera una replica idntica de un rbol binario.

void duplicar(enlace T, enlace *P)
enlace n;
if (T != null)
N = malloc(sizeof(nodo));
N dato = T dato;
N izq = null;
N der
cant_hojas = cuenta_hojas(T);
tamao = altura(T);
{ if cont_hojas = = ( 2 ^ tamao)
printf(el arbol es completo);
else
printf(el arbol no es completo),
}









Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
96
8.- Procedimiento que elimina las hojas de un rbol, las cuales no tienen hermanos.

void eli-hojas(enlace T,)
if (*T != null)
{ if (*T der = = null && *T izq != null);
free(*T);
*T = null;
else
if (*T der != null && *T der = = null);
free(*T);
*T = null;
}
else
eli_hojas(&T der);
eli_hojas(&T izq);
}

9.- Procedimiento que elimina las hojas que se encuentran mas a la derecha de un
rbol.

void hojaderecha(enlace *T)
if (*T != null)
{ if (*T der = = *T izq);
free(*T);
*T = null;
else
hojaderecha(*T der);
}
}

10.- Procedimiento que elimina todas las hojas de un rbol.

void podar(enlace T,)
if (*T != null)
{ if (T izq = = T der);
free(*T);
*T = null;
else
podar(&T izq);
podar(&T der);
}
}









Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
97
26.- Conclusiones

De acuerdo a las experiencias vividas durante los semestres anteriores, es decir el ao
2006, en las clases del ramo Programacin dictado por el profesor Ricardo Corbinaud Perez,
ms todo lo que hemos logrado recopilar durante el desarrollo de este manual del lenguaje C,
logramos concluir entre todos los compaeros participantes de este proyecto, que conociendo
y teniendo claro la funcionalidad de las distintas estructuras que pertenecen al lenguaje C, el
aprendizaje de otros lenguajes derivados de este y que se utilizan en la actualidad, se torna
mas sencillo y fcil de retener.










































Universidad Tecnolgica Metropolitana
Ingeniera Ejecucin en Informtica
________________________________________________________________________________________________________________
__________________________________________________________________________
98
27.- Bibliografa

Informacin, materia y ejercicios obtenidos de las distintas clases de los semestres
correspondientes al ao 2006, de las clases de Programacin, de la carrera ingeniera en
informtica plan especial, con el profesor Ricardo Corbinaud.

Programacin en C. Schaum, McGraw-Hill, 2 edicin, 1997
Lenguaje de Programacin en C. Luis Joyanes Aguilar, McGraw-Hill, 2 edicin, 2005

Paginas Web, desde las cuales se obtuvieron ejercicios e informacin de cada uno de los
mdulos detallados en el presente manual.

1. http://www.uib.es
2. http://www.abcdatos.com
3. http://elvex.ugr.es/decsai/c/
4. http://www1.ceit.es/Asignaturas/Informat2/C/Prog_c.htm#ejercicios
5. http://decsai.ugr.es/~jfv/ed1/tedi/cdrom/docs/m-listas.html
6. http://decsai.ugr.es/~jfv/ed1/tedi/cdrom/docs/m-listas.html
7. http://www.ulpgc.es/otros/tutoriales/mtutor/indice.html
8. http://c.conclase.net/curso/index.php?cap=001
9. http://www.programacionenc.net
10. http://www.cimec.org.ar/~mstorti/repositorio-cpp/
11. http://www.geocities.com/SiliconValley/8195/cprog.html
12. http://www.geocities.com/SiliconValley/8195/cprog.html
13. http://www.misalgoritmos.com
14. http://www.conclase.net
15. http://ainsuca.javeriana.edu.co/e-datos/semana06/multilista.html