Documentos de Académico
Documentos de Profesional
Documentos de Cultura
RESUMEN PROGRAMACIN I
TIPOS DE DATOS .......................................................................................... 2
DATOS SIMPLES ................................................................................................................................................................ 2
DATOS COMPLEJOS (ESTRUCTURA DE DATOS) ................................................................................................................. 2
OPERADORES .................................................................................................................................................................... 2
VECTORES .................................................................................................... 4
OPERACIONES TPICAS CON VECTORES ............................................................................................................................ 5
FUNCIONES ................................................................................................. 17
A)
B)
C)
D)
E)
F)
SELECCIN ............................................................................................................................................................. 20
BURBUJA ................................................................................................................................................................ 20
ALEATORIEDAD .......................................................................................... 23
RAND() .............................................................................................................................................................................. 23
SRAND() ............................................................................................................................................................................ 23
ESTRUCTURAS ........................................................................................... 24
DECLARACIN DE ESTRUCTURAS ................................................................................................................................... 24
PASO DE ESTRUCTURAS A FUNCIONES ........................................................................................................................... 24
LISTAS ......................................................................................................... 28
DEFINICIN ..................................................................................................................................................................... 28
FUNCIONES BSICAS SOBRE LISTAS ................................................................................................................................ 29
http://www.algoritmia.net
http://es.wikibooks.org/wiki/Programaci%C3%B3n_en_C
http://www.fismat.umich.mx/mn1/manual/manual.html
http://profeblog.es/blog/alfredo/curso-de-programacion-en-c/
Programacin I
TIPOS DE DATOS
DATOS SIMPLES: predefinidos por el lenguaje
Tipo de dato
Int
Float
Char
Char [n]
Especificadores
de formato
%d
%f
%c
%s
Comentario
Entero con signo
Real con signo
caracter
Cadena de caracteres
Estticas: son aqullas que ocupan un espacio determinado en la memoria del ordenador.
Este espacio es invariable y lo especifica el programador durante la escritura del cdigo
fuente.
Dinmicas: sin aqullas cuyo espacio ocupado en la memoria puede modificarse durante la
ejecucin del programa.
OPERADORES
Nombre del Operador
Smbolo o representacin
nombre.miembro nombre->miembro
*, /, %
Suma y resta
+, -
<<, >>
==, !=
&
OR para bits
&&
OR para comparacion
||
Expresiones de condiciones
Incrementar c en n, Decrementar c en n,
Multiplicar c por n, Dividir c entre n
Orden de
agrupacin
izquierda ->
derecha
derecha ->
izquierda
izquierda ->
derecha
izquierda ->
derecha
izquierda ->
derecha
izquierda ->
derecha
izquierda ->
derecha
izquierda ->
derecha
izquierda ->
derecha
izquierda ->
derecha
izquierda ->
derecha
izquierda ->
derecha
derecha ->
izquierda
derecha ->
izquierda
Programacin I
ESTRUCTURAS DE CONTROL
Se clasifican en estructuras de decisin y estructuras de ciclos
ESTRUCTURAS DE CICLOS
Se utilizan para repetir una sentencia o un grupo de sentencias. La cantidad de veces que se repite
puede ser conocida de antemano o no.
WHILE
while (Condicin)
{
sentencia 1;
sentencia 2;
sentencia N;
}
FOR
for (pre ejecucin; condicin; pos ejecucin)
{
sentencia 1;
sentencia 2;
sentencia N;
}
Programacin I
VECTORES
Un array (arreglo) es una agrupacin de varios datos individuales del mismo tipo bajo el mismo
nombre. Cada dato individual de un array es accesible mediante un ndice.
El caso ms simple de array es el array unidimensional, tambin llamado vector. Por ejemplo, un
vector de nmeros enteros es una coleccin de varios nmeros enteros a los que les adjudicamos
un nico identificador.
Programacin I
Cada elemento del vector es una variable que puede usarse independientemente de los dems
elementos. As, por ejemplo, un elemento del vector serie puede usarse en una instruccin de
salida igual que cualquier variable simple de tipo int:
int serie[5];
serie[0] = 21;
printf("%i", serie[0]);
Del mismo modo, pueden usarse elementos de vector en una instruccin de entrada. Por ejemplo:
int serie[5];
scanf("%i", &serie[0]);
serie[1] = serie[0] + 15;
printf("%i", serie[1]);
2) Recorrido de un vector
Una forma habitual de manipular un vector es accediendo secuencialmente a todos sus elementos,
uno tras otro. Para ello, se utiliza un bucle con contador, de modo que la variable contador nos
sirve como ndice para acceder a cada uno de los elementos del vector.
Supongamos, por ejemplo, que tenemos un vector de 10 nmeros enteros declarado como int
v[10]; y una variable entera declarada como int i; Por medio de un bucle podemos realizar todas
estas operaciones:
Programacin I
d) Realizar alguna operacin que implique a todos los elementos. Por ejemplo, sumarlos:
suma = 0;
for (i = 0; i <= 9; i++)
{
suma = suma + v[i];
}
3) Bsquedas en vectores
Si las bsquedas se realizan pocas veces, o bien los vectores son pequeos, optaremos por
la bsqueda secuencial, que no necesita ordenar previamente el vector.
Si las bsquedas se realizan muchas veces y los vectores son de gran tamao, optaremos
por la bsqueda binaria, pero antes debemos ordenar el vector
a) Bsqueda secuencial
Consiste en recorrer el vector desde el primer elemento hasta el ltimo. Si encontramos el dato
buscado, podemos interrumpir la bsqueda. Si no, continuaremos hasta el final del vector.
Programacin I
// Lo hemos encontrado
// Anotamos en x la posicin
i++;
}
return x;
}
b) Bsqueda binaria
Para que esta bsqueda funcione, el vector debe estar previamente ordenado. El mtodo consiste
en lo siguiente:
Programacin I
// Lo hemos encontrado !!
encontrado = 1;
if (v[mitad] > busc)
der = mitad-1;
if (v[mitad] < busc)
izq = mitad+1;
}
if (encontrado == 1)
return mitad;
else
return -1;
}
Programacin I
Para pasar un vector como argumento a una funcin, en la llamada a la funcin se escribe
simplemente el nombre del vector, sin ndices. Esto sirve para pasar a la funcin la direccin de
memoria donde se almacena el primer elemento del vector. Como C guarda todos los elementos de
los vectores en posiciones de memoria consecutivas, conociendo la direccin del primer elemento
es posible acceder a todas las dems.
El hecho de que a la funcin se le pase la direccin del vector y no sus valores provoca un efecto
importante: que los arrays siempre se pasan por referencia, nunca por valor. Por lo tanto, si algn
elemento del vector se modifica en una funcin, tambin ser modificado en la funcin desde la
que fue pasado.
Como siempre se pasan por referencia, no es necesario utilizar el smbolo & delante del parmetro.
Por ejemplo, supongamos que serie es un vector de 15 nmeros enteros. Para pasarlo como
parmetro a una funcin llamada funcion escribiramos simplemente esto:
int serie[15];
funcion1(serie);
/* Array delimitado */
/* Array no delimitado */
/* Puntero */
El resultado de las tres declaraciones es, en principio, idntico, porque todas indican al compilador
que se va a recibir la direccin de un vector de nmeros enteros.
Dentro de la funcin, el vector puede usarse del mismo modo que en el programa que la llama, es
decir, no es preciso utilizar el operador asterisco.
Por ejemplo: Un programa que sirve para leer 50 nmeros por teclado, y calcular la suma, la media
y la desviacin tpica de todos los valores. La desviacin es una magnitud estadstica que se
calcula restando cada valor del valor medio, y calculando la media de todas esas diferencias.
Observe el siguiente programa de ejemplo detenidamente, prestando sobre todo atencin al uso de
los vectores y a cmo se pasan como parmetros.
Los nmeros de la serie se almacenarn en un vector float de 50 posiciones llamado valores. La
introduccin de datos en el vector se hace en la funcin introducir_valores(). No es necesario usar
Programacin I
10
el smbolo & al llamar a la funcin, porque los vectores siempre se pasan por referencia. Por lo
tanto, al modificar el vector dentro de la funcin, tambin se modificar en el algoritmo principal.
Despus, se invoca a tres funciones que calculan las tres magnitudes. El vector tambin se pasa
por referencia a estas funciones.
#include <stdio.h>
#include <math.h>
int main(void)
{
float valores[50];
float suma, media, desviacion;
introducir_valores(valores);
suma = calcular_suma(valores);
media = calcular_media(valores, suma);
desviacion = calcular_desviacion(valores, media);
printf("La suma es %f, la media es %f y la desviacin es %f", suma, media,
desviacion);
return 0;
}
/* Lee 50 nmeros y los almacena en el vector N pasado por variable */
void introducir_valores(float N[50])
{
int i;
for (i=1; i<=49; i++)
{
printf("Introduzca el valor n %d: ", i);
scanf("%f", &N[i]);
}
}
Programacin I
11
Programacin I
12
MANEJO DE CADENAS
Los vectores cuyos elementos son caracteres se denominan cadenas de caracteres o,
simplemente, cadenas. Por lo tanto, una cadena de caracteres se declara as:
char cadena[50];
/* Cadena de 50 caracteres */
Las cadenas deben tener, despus de su ltimo carcter vlido, un carcter especial llamado nulo
\0.
En consecuencia, en una cadena definida como la anterior, de 50 caracteres, en realidad slo
tienen cabida 49, ya que siempre hay que reservar una posicin para el carcter nulo.
La declaracin de una cadena puede ir acompaada de una inicializacin mediante una constante.
En este caso, la constante debe ir encerrada entre comillas dobles, al tratarse de una cadena y no
de caracteres sueltos. Por ejemplo:
char cadena[50] = "Hola";
En inicializaciones de este tipo, el compilador se encarga de aadir el carcter nulo.
Por ltimo, sealemos que no es necesario indicar el tamao de la cadena si se inicializa al mismo
tiempo que se declara. Por ejemplo, la declaracin anterior puede sustituirse por esta otra:
char cadena[] = "Hola";
Esto se denomina array de longitud indeterminada. El compilador, al encontrar una declaracin as,
crea una cadena del tamao suficiente para contener todos los caracteres. Esto vale no slo para
las cadenas, sino que tambin es aplicable a cualquier otro tipo de array que se inicialice al mismo
tiempo que se declare.
Programacin I
13
char cad[50];
n = atoi(cad);
1. gets() y puts()
Para leer por teclado una cadena de caracteres se puede utilizar tambin la funcin scanf() con la
cadena de formato %s. Como las cadenas son vectores, no es preciso anteponer el smbolo & al
nombre de la variable. Sin embargo, es preferible emplear la funcin gets() por estar
especficamente diseada para la lectura de cadenas. Por ejemplo:
char cadena[50];
printf("Introduzca su nombre ");
gets(cadena);
Programacin I
14
3. strlen()
Devuelve la longitud de una cadena, es decir, el nmero de caracteres de que consta, sin contar el
carcter nulo.
Por ejemplo, en este fragmento de cdigo el resultado debe ser 11. Fjate que la variable cadena
tiene una longitud total de 50 caracteres, pero strlen() slo cuenta los que efectivamente se estn
usando, es decir, los que hay hasta el carcter nulo:
char cadena[50] = "Hola, mundo";
int longitud;
longitud = strlen(cadena);
printf("La longitud es %i", longitud);
4. strcmp()
Compara dos cadenas. Devuelve el valor 0 si son iguales, un valor mayor que 0 si la primera es
alfabticamente mayor que la segunda, o un valor menor que 0 en caso contrario. Su sintaxis es
general es:
strcmp(cadena1, cadena2);
Por ejemplo:
char cad1[50], cad2[50];
int comparacion;
printf("Introduzca dos cadenas");
scanf("%s %s", cad1, cad2);
comparacion = strcmp(cad1, cad2);
if (comparacion == 0)
printf("Las dos cadenas son iguales");
5. strcat()
Concatena dos cadenas. Esta funcin aade la cadena2 al final de la cadena1, incluyendo el
carcter nulo.
strcat(cadena1, cadena2);
El resultado de este ejemplo debe ser, otra vez, hola, mundo:
char cad1[50] = "Hola, ";
char cad2[50] = "mundo";
strcat(cad1, cad2);
prinft("%s", cad1);
Programacin I
15
6. strchr()
Devuelve la posicin en memoria de la primera aparicin de un caracter dentro de la cadena
posicion = strchr(cadena, caracter)
7. strstr()
Devuelve la posicin en memoria de la primera aparicin de una subcadena dentro de la cadena
posicion = strstr(cadena,subcadena)
Ejemplo general:
#include <stdio.h>
#include <string.h>
...
char color[] = "rojo";
char grosor[] = "grueso";
...
char descripcion[1024];
strcpy(descripcion, "Lapiz color ");
strncat(descripcion, color, 1024);
strncat(descripcion, " de trazo ", 1024);
strncat(descripcion, grosor, 1024);
// descripcion contiene "Lapiz color rojo de trazo grueso"
...
void intercambiar(char vector[], int pos1, int pos2);
void invierte_cadena(char cadena[])
{
int largo = strlen(cadena);
for (int i=0; i < (largo/2); i++) {
intercambiar(cadena, i, (largo-1)-i);
}
}
void intercambiar(char vector[], int pos1, int pos2)
{
char aux=vector[pos1];
vector[pos1]=vector[pos2];
vector[pos2]=aux;
}
Programacin I
16
PUNTEROS
#include <stdio.h>
#include <stdlib.h>
int l1 (char c[]);
int l2 (char c[]);
int main(void) {
int x, i, z[10];
int *p;
char vec[50];
printf("ingrese una cadena \n");
fgets( vec, 50, stdin);
printf ("el largo de la cadena es %d \n", l2(vec));
return EXIT_SUCCESS;
}
int l1 (char c[])
{
int i;
for (i=0; c[i] != '\0'; i++)
;
return i;
}
int l2 (char *c)
{
int i;
for (i=0; *c
;
return i;
}
Programacin I
17
FUNCIONES
Definicin: Grupo de sentencias bajo el mismo nombre que realizan una tarea especfica.
Uso: utilizar el valor retornado por la funcin, almacenndolo en una variable o utilizndolo en una
expresin.
a) PROTOTIPADO DE FUNCIONES
Se realiza despus de las libreras y antes del cuerpo del programa (main). Se compone de:
Tipo_de_dato_de_retorno Nombre_de_la_funcion(parmetros);
Ejemplo: int largo(char cadena[]);
b) DECLARACIN DE FUNCIONES
La funcin se declara por fuera del cuerpo del programa, como subprograma. Las variables de la
funcin son locales, mientras que las declaradas en main son globales.
Tipo_de_dato_de_retorno Nombre_de_la_funcion(parmetros) (idem prototipo, pero sin el ;)
{
Variables
locales;
Sentencias;
Return valor; (si la funcin devuelve un valor)
}
Ejemplo:
int largo(char cadena[])
{
int i;
for(i=0;cadena[i]!=0;i++);
return i;
}
c) INVOCACIN DE FUNCIONES
La llamada a la funcin se realiza desde el cuerpo del programa (main). Consiste en una mencin
al nombre de la funcin seguida, entre parntesis, de los valores que se desean asignar a los
parmetros. Deben aparecer tantos valores como parmetros tenga la funcin, y adems coincidir
en tipo.
Programacin I
18
d) PASO DE PARMETROS
Existen dos formas de pasar parmetros:
1. Paso por Valor: Se enva una copia de los parmetros a la funcin, por lo tanto los cambios
que se hagan en ella no son tomados en cuenta dentro de la funcin main()
2. Paso por Referencia: Se enva la direccin de memoria de la variable, por lo tanto los
cambios que haga la funcin si afectan el valor de la variable dentro de la funcin main()
Para pasar valores por referencia, utilizamos un asterisco delante del parmetro.
e) FUNCIONES VOID
Si el Tipo_de_dato_de_retorno es void, se considera que la funcin no devuelve ningn valor y
que, por lo tanto, es un procedimiento. Un ejemplo de procedimiento es la funcin printf.
Programacin I
19
/*
============================================================================
Name
: ADComplejo.c
Author
: German
Version
:
Copyright
: Your copyright notice
Description : Ejemplo complejo de alocacion dinamica de memoria
============================================================================
*/
#include <stdio.h>
#include <stdlib.h>
int mystrlen(char *c);
void mystrcpy (char *ori, char *dest);
int main(void) {
int i;
char *c[5];
char aux[1000];
for (i=0;i<5;i++)
{
printf ("ingrese la cadena %d \n", i); //obtenemos la cadena en un
auxiliar
fgets(aux,1000,stdin);
c[i] = malloc (sizeof(char) * mystrlen(aux)); //calculamos el tamao
de la cadena y alocamos el espacio
mystrcpy(aux,c[i]); //copiamos el contenido del auxiliar a la
posicion del vector de cadenas correspondientes
}
for (i=0;i<5;i++)
printf ("ingrese la cadena %d es : %s \n", i, c[i]);
return EXIT_SUCCESS;
}
int mystrlen(char *c)
{
int i=0;
while (*c != '\0')
{
i++;
c++;
}
return i;
}
void mystrcpy (char *ori, char *dest)
{
while (*ori != '\0')
{
*dest = *ori;
dest++;
ori++;
}
*dest = '\0';
}
Programacin I
20
MTODOS DE ORDENAMIENTO
Su finalidad es organizar ciertos datos (normalmente arrays o ficheros) en un orden creciente o
decreciente mediante una regla prefijada (numrica, alfabtica, etc) atendiendo al tipo de elemento
que se quiera ordenar.
Tipos
Interna: Los datos se encuentran en memoria (ya sean arrays, listas, etc) y son de acceso
aleatorio o directo (se puede acceder a un determinado campo sin pasar por los anteriores)
Ordenacin Interna
1) SELECCIN
Este mtodo consiste en buscar el elemento ms pequeo del array y ponerlo en primera posicin;
luego, entre los restantes, se busca el elemento ms pequeo y se coloca en segundo lugar, y as
sucesivamente hasta colocar el ltimo elemento.
2) BURBUJA
Consiste en comparar pares de elementos adyacentes e intercambiarlos entre s hasta que estn
todos ordenados.
/*
============================================================================
Name
: ordenamiento.c
Author
: German
Version
:
Copyright
: Your copyright notice
Description : test de ordenamiento
============================================================================
*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAXLEN 10
//prototipos
void llenarArray(int v[], int l);
void mostrarArray(int v[], int l);
void selecSort(int v[], int l);
void burbuSort(int v[]);
int estaOrdenado(int v[], int l);
Programacin I
21
int main(void)
{
int array[MAXLEN];
llenarArray(array, MAXLEN);
mostrarArray(array,MAXLEN);
if (estaOrdenado(array,MAXLEN))
printf ("Esta ordenado!!\n");
else
printf ("Esta desordenado!! \n");
selecSort(array, MAXLEN);
mostrarArray(array,MAXLEN);
if (estaOrdenado(array,MAXLEN) == 1)
printf ("Esta ordenado!!\n");
else
printf ("Esta desordenado!! \n");
/*
llenarArray(array, MAXLEN);
mostrarArray(array,MAXLEN);
burbuSort(array);
mostrarArray(array,MAXLEN);
*/
return EXIT_SUCCESS;
}
//toma el array y su limite. lo llena de elementos aleatorios
void llenarArray(int v[], int l)
{
int i;
srand(time(NULL));
for (i = 0 ; i < l ; i++)
v[i] = rand()%1000;
}
//toma el array y su limite, muestra por pantalla
//posicion a posicion
void mostrarArray(int v[], int l)
{
int i;
for (i = 0 ; i < l ; i++)
printf ("la posicion %d es: %d \n", i, v[i]);
}
Programacin I
22
Programacin I
23
ALEATORIEDAD
Cuando necesitamos obtener nmeros de forma aleatoria, utilizamos alguna de las siguientes
funciones:
rand()
Esta funcin nos devuelve un nmero entero aleatorio entre 0 y el RAND_MAX (mnimo de 32767,
dependiendo de la librera)
Si queremos acotar el rango, por ejemplo, un nmero aleatorio entre 0 y 10:
numero = rand() % 11;
O de forma ms general, entre 0 y N:
numero = rand() % (N+1);
La operacin mdulo (%) nos da el resto de dividir rand() entre 11. Este resto puede ir de 0 a 10.
De la misma forma, el mdulo de rand() entre N+1 va de 0 a N.
Si queremos, por ejemplo, un rango entre 20 y 30 (de forma ms general, entre M y N con N mayor
que M), obtenemos un nmero entre 0 y 10 y le sumamos 20 (un nmero entre 0 y N-M y le
sumamos M)
numero = rand () % 11 + 20;
// entre 20 y 30
// entre M y N
srand()
Si ejecutamos varias veces nuestro programa, la secuencia de nmeros aleatorios se repite.
El problema es que rand() "calcula" los nmeros aleatorios, partiendo de un nmero inicial (llamado
semilla).
Para evitar este problema tenemos la funcin srand(), a la que se le pasa como parmetro un
nmero que se utilizar como nmero inicial para las cuentas. A esta funcin slo debemos
llamarla una vez en nuestro programa.
La fecha/hora del sistema: este valor cambia si ejecutamos el programa en distinto instante
de tiempo. Tendramos que arrancar el programa dos veces en el mismo segundo para
obtener la misma secuencia de nmeros aleatorios.
srand (time(NULL));
Programacin I
24
ESTRUCTURAS
Una estructura es una agrupacin bajo el mismo nombre de varios datos cuyos tipos pueden ser
diferentes.
DECLARACIN DE ESTRUCTURAS
struct nombre_estructura
{
tipo1 dato1;
tipo2 dato2;
...
tipoN datoN;
};
Podemos asignarle un alias o sinnimo al nombre de la estructura, para evitar el tener que poner
"struct nombre_estructura" cada vez, usando la palabra clave typedef, lo que crea un alias a un
tipo:
typedef struct nombre_estructura nuevotipo;
As, podemos escribir nuevotipo en lugar de struct mi_estructura a lo largo del programa, lo cual
es mucho ms legible.
Programacin I
25
Programacin I
26
getTriangulo(&t);
getTriangulo(&z);
printf ("el lado a vale: %d \n", t.a);
printf ("el lado b vale: %d \n", t.b);
printf ("el lado c vale: %d \n", t.c);
return EXIT_SUCCESS;
Programacin I
27
Programacin I
28
LISTAS
DEFINICIN
Una lista es una estructura de datos secuencial.
Una manera de clasificarlas es por la forma de acceder al siguiente elemento:
lista densa: la propia estructura determina cul es el siguiente elemento de la lista. Ejemplo: un
array.
Como se ha dicho anteriormente, pueden cambiar de tamao, pero su ventaja fundamental es que
son flexibles a la hora de reorganizar sus elementos; a cambio se ha de pagar una mayor lentitud a
la hora de acceder a cualquier elemento.
Programacin I
29
Implementacin
struct nodo
{
int dato;
struct nodo *sig;
};
typedef struct nodo NODO;
Programacin I
30
}
}
Programacin I
31
t_nodo *segundo;
if (primero != NULL) {
// Comprobamos que la lista no est vaca
segundo = primero->siguiente;
// Guardamos la referencia al segundo elemento
free(primero);
// Eliminamos el primero (es importante liberar la memoria)
primero = segundo;
// El que era segundo se convierte en primero
}
b) Eliminar un nodo cualquiera: Suponiendo que queremos eliminar el nodo siguiente a
aqul que contiene en dato 7:
t_nodo *anterior, *aux;
// Primera parte: buscar el nodo anterior al que vamos a borrar (contendr el
dato 7)
anterior = primero;
while ((anterior->dato != 7) && (anterior != NULL))
anterior = anterior->siguiente;
// Segunda parte: borrar el nodo siguiente y reasignar los punteros
if (anterior != NULL) {
// Comprobamos que hemos encontrado el
punto de eliminacin
aux = anterior->siguiente;
// aux es
el nodo que queremos eliminar
anterior->siguiente = aux->siguiente; // Reasignamos los enlaces
free(aux);
// Eliminamos el nodo
}
c) Eliminar todos los nodos de una lista:
Para eliminar una lista completa hay que recorrer todos los nodos e ir liberando la memoria de cada
uno, hasta que alcancemos el ltimo nodo (que reconoceremos porque estar apuntando a NULL).
Otra manera de hacerlo es eliminar el primer elemento de la lista repetidamente, segn el algoritmo
que hemos visto antes, hasta que el primer elemento sea NULL. Eso significar que la lista se ha
quedado vaca.
Programacin I
32
/*
============================================================================
Name
: listasSimples.c
Author
: German
Version
:
Copyright
: Your copyright notice
Description : Hello World in C, Ansi-style
============================================================================
*/
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
struct nodo
{
int dato;
struct nodo *sig;
};
typedef struct nodo NODO;
NODO *CrearNodo();
void MostrarLista(NODO *l);
NODO * InsertarNodoOrdenado(NODO *l, NODO *n);
NODO * InsertarNodoDesOrdenado(NODO *l, NODO *n);
int main(void) {
NODO *raiz;
NODO *nodoAux;
NODO *newNodo;
int cantNodos;
int i;
system("clear");
printf("Ingrese la cantidad de nodos a crear: ");
scanf("%d", &cantNodos);
if (cantNodos < 1)
{
printf("la cantidad de nodos debe ser mayor a 1 \n");
return (0);
}
raiz = CrearNodo();
nodoAux = raiz;
for (i = 1; i < cantNodos; i++)
{
newNodo= CrearNodo();
nodoAux = InsertarNodoDesOrdenado(nodoAux, newNodo);
MostrarLista(nodoAux);
}
raiz = nodoAux;
MostrarLista(raiz);
}
Programacin I
33
NODO * CrearNodo()
{
NODO *nodoAux;
nodoAux = (NODO *) malloc(sizeof(NODO));
printf("ingrese un valor para el nodo \n");
fflush(stdin);
scanf("%d", &nodoAux->dato);
nodoAux->sig = NULL;
return nodoAux;
}
void MostrarLista(NODO *l)
{
printf("\n****************** display de la lista ******************\n\n");
while (l->sig != NULL)
{
printf ("| %d ", l->dato);
l = l->sig;
}
printf ("| %d | \n", l->dato);
printf("\n****************** display de la lista ******************\n");
}
NODO * InsertarNodoOrdenado(NODO *l, NODO *n)
{
NODO *aux;
if (n->dato < l->dato)
{
n->sig = l;
return (n);
}
else
{
aux = l;
while (aux->sig != NULL && aux->sig->dato < n->dato )
aux = aux->sig;
if (aux->sig == NULL)
aux->sig = n;
else
{
n->sig=aux->sig;
aux->sig=n;
}
return (l);
}
}
NODO * InsertarNodoDesOrdenado(NODO *l, NODO *n)
{
n->sig = l;
return (n);
}