You are on page 1of 12

Lenguajes de Programacin o Ayudant 1: Recordando el pasado a Versin 1 - Semestre 1 o

Camilo Zambrano Lagos <cizambra@alumnos.inf.utfsm.cl> 24 de abril de 2012

1.

Introduccin o

Esta ayudant consiste en bsicamente recordar en forma supercial el uso de ciertos recursos utilizaa a dos en asignaturas anteriores, como por ejemplo, las bases del lenguaje de programacin C, el uso terico o o de listas y su implementacin en los lenguajes de programacin. El objetivo es que el estudiante logre o o incorporar todo lo enseado de forma n ntegra y permanente a su caja de herramientas de programacin, o para enfrentar cualquier problema que requiera el uso de sto. En ste texto se asumir que el estudiante e e a posee conocimientos acerca de los trminos tcnicos que se emplearn de aqu en adelante (son trminos e e a e ya vistos en otros ramos).

2.

El lenguaje de programacin C o

El lenguaje de programacin C, es un lenguaje creado el ao 1972 por Dennis M. Ritchie en Bell o n Labs., orientado a la implementacin de Sistemas Operativos. La losof de ste lenguaje consiste en o a e buscar la simplicidad en la traduccin de cada elemento del lenguaje al lenguaje mquina, de modo de o a disminuir el tiempo de ejecucin en las tareas a realizar. Inicialmente, C se desarroll por programadores o o para programadores, sin embargo en la actualidad se ha convertido en uno de los lenguajes ms populares, a volvindose herramienta en contextos muy distintos a los originales. e

2.1.

Caracter sticas
Es un lenguaje compilado. Es un lenguaje de nivel medio-bajo. Es case-sensitive (sensible a maysculas). u

2.2.
2.2.1.

Componentes
Variables y constantes

Las variables y constantes corresponden a una forma ms entendible de representar de una dia reccin de memoria en donde se guardar un dato o conjunto de datos de un tipo determinado. Toda o a representacin (sea variable o constante) posee una direccin de memoria, un valor y un mbito de acceso o o a del programa donde es vlido. La diferencia la marca la posibilidad de cambio de valor de la reprea sentacin, esto signica, una variable puede cambiar su valor durante la ejecucin de la aplicacin, al o o o contrario de una constante en donde su valor no cambia durante la ejecucin de la misma. Se tienen dos o tipos de variables: Globales: Son declaradas despus de las cabeceras pero antes de cualquier funcin y su mbito de e o a acceso corresponde al programa completo. 1

Locales: Son declaradas dentro de una funcin, por lo que su mbito se remite slo a nivel interno o a o de la funcin (local). o La sintaxis para la declaracin de variables puede ser de dos formas: o [<modificador>] <tipo_dato> <identificador>; , o bien <tipo_dato> [<modificador>] <identificador>; , donde el tipo de dato puede ser predenido o propio del lenguaje C, combinado a partir de los denidos, o bien, ser denido por el programador; el modicador corresponde a un elemento que puede indicar el a mbito (por defecto es local si se encuentra dentro de una funcin y global si se encuentra fuera), o bien o indicar si es constante o variable (por defecto es variable), y los identicadores son bsicamente nombres a que deben cumplir con la norma de identicadores para C. Para asignar variables se usa la siguiente sintaxis: <identificador> = <valor>; Mientras una variable no se inicialice, su valor ser indeterminado (cuidado con sto!). Una variable a e puede ser inicializada durante su declaracin: o [<modificador>] <tipo> <identificador> = <valor>; Por su parte, las constantes pueden denirse de dos formas: Mediante la sentencia de preprocesador #define. Declarando una variable con el modicador const, en donde es obligacin realizar al mismo tiempo o la asignacin. o 2.2.2. Expresiones y operadores

Los operadores son elementos que indican una operacin a realizar para evaluar un valor. Los o operandos son variables y constantes. Una expresin corresponde a la combinacin entre operadores o o y operandos. Ejemplos de expresiones: operador1 + operador2 operador2 = operador1 Se asume en ste texto que el estudiante ha visto los operadores con los que C cuenta, a lo largo de sus e aos de estudio en el rea de programacin. n a o 2.2.3. Punteros

Bsicamente un puntero, es un tipo de dato que representa una direccin de memoria en la cual se a o almacena un dato o bien se aloja una funcin. Para declarar punteros se hace uso de la siguiente sintaxis: o <tipo_dato> * <identificador>; Si <tipo dato> corresponde a void, el puntero puede apuntar a una funcin (se ver ms adelante en o a a ste mismo texto) o bien a cualquier tipo de dato. Para acceder a una direccin de memoria se debe e o utilizar el operador &, as por ejemplo se puede tener la siguiente declaracin y asignacin de un puntero: , o o data_t value; data_t * value_p; value_p = &value; Para acceder al contenido de un puntero se debe utilizar el operador *, as por ejemplo se puede tener , la siguiente declaracin y asignacin de un puntero: o o 2

data_t value; data_t value2; data_t * value_p; value_p = &value; value2 = (*value_p)+2; En uno o ms punteros, pueden realizarse operaciones aritmticas (segn el tipo apuntado), de comparaa e u cin (comparan direcciones, no contenido) o de asignacin (copia la direccin, no los contenidos, segn o o o u eso podr decirse que si se modica el valor en un puntero, entonces el valor contenido en el puntero a recin asignado tambin cambia ya que la direccin de referencia es la misma). e e o Los punteros son elementos en los que hay que tener sumo cuidado al momento de programar, ya que es necesario tener ciertas precauciones al momento de trabajar con ellos, por asuntos de acceso a la memoria. Es importante el tener cuidado de no acceder a zonas de memoria no declaradas por el programa, generalmente sto se traduce en errores de violacin de segmento y son errores que no se detectan al e o momento de compilar, slo al momento de ejecutar. Por lo anterior, es muy importante que se entienda o la diferencia entre los operadores * y & para el caso de los punteros. 2.2.4. Control de Flujo

En el caso de ste tipo de sentencias, existe una subclasicacin: e o Sentencias condicionales: Son aquellas que ejecutan una vez, una o mltiples l u neas de cdigo, o sujetas a una condicin. Dentro de sta clasicacin, se encuentran las sentencias if y switch. o e o Ejemplo de sentencia if: // If condition is equal to expr. if (condition == expr) { // Do something. } else { // Do another thing. } Ejemplo de sentencia switch: switch (condition) { // If condition is equal to cons1. case cons1: // Do something. break; // If condition is equal to cons2. case cons2: // Do another thing. break; // Otherwise. default: // Do default thing. } Sentencias repetitivas: Son aquellas que ejecutan una o mltiples veces, una o mltiples l u u neas de cdigo, sujetas a una condicin. Dentro de sta clasicacin se encuentran las sentencias while, o o e o do-while, for. Ejemplo de sentencia while: // While cond is different from expr then do something. while (cond != expr) { // Do something. } 3

Ejemplo de sentencia do-while: // Execute at least once, and repeat if cond is different from expr. do { // Do something. } while (cond != expr); Ejemplo de sentencia for: // Count the loops, store them on i, while cond is different to expr. for (int i = 0 ; cond != expr ; i++ ) { // Do something. } 2.2.5. Funciones

Las funciones son bloques de sentencias que realizan una tarea ms o menos concreta, stos bloques a e pueden ser llamado una o ms veces y pueden retornar o no, un resultado. Al igual que las funciones a matemticas, stas funciones pueden hacer uso de parmetros o argumentos. a e a Conociendo ya el concepto de punteros, puede mencionarse que los valores originales que una funcin o recibe como parmetros pueden ser modicados en tiempo de ejecucin; a ste tipo de paso de variables, a o e se le conoce como paso por referencia. Hay otras ocasiones, en donde el valor original se mantiene luego de ejecutarse la funcin, y lo que se hace internamente es copiar el valor del parmetro en una variable o a local, que es la que se usa para realizar las operaciones necesarias; a ste tipo de paso de variables, se le e conoce como paso por valor. Es importante comentar, que dentro de un mismo archivo fuente no pueden declararse dos funciones con el mismo identicador (polimorsmo), la unica excepcin es la funcin main. o o Dentro de un archivo fuente, se realizan tres acciones distintas relacionadas con funciones: declaracin, o denicin y llamada. La declaracin debe hacerse antes de la funcin main, tanto en forma de rmas (o o o o prototipos), como en forma de archivos de cabecera. La sintaxis para la declaracin es la siguiente: o <tipo> <identificador> ([<parmetros>]); a Donde <tipo> corresponde a void si es que no hay valor de retorno, y [<parmetros>] corresponde a a una lista de tipos (que pueden ser acompaados por identicadores, para una mayor comprensin), n o separados por comas (,), la lista es opcional, y puede no ser especicada, o bien especicada como void. La denicin corresponde a la implementacin del cdigo de la funcin, y debe hacerse posterior a la o o o o funcin main; la sintaxis para la denicin de funciones es la siguiente: o o <tipo> <identificador> ([<parmetros>]) { a [<declaracin de variables locales>] o [<sentencias>] [return <expresion>;] } Donde, a diferencia de la declaracin, [<parmetros>] debe llevar siempre un identicador por cada o a tipo en la lista. Es muy importante mencionar, que las deniciones pueden encontrarse dentro del mismo archivo despus de main, o bien en archivos *.c aparte, o bien en archivos ya compilados. e Para la llamada a una funcin se utiliza la siguiente sintaxis: o ...<identificador> ([<parmetros>])... a Donde [<parmetros>] corresponde a los valores reales enviados al momento de la llamada, separados a por comas(,), stos valores reales pueden ser variables (o constantes) o bien expresiones. Una funcin e o puede ser llamada desde main, otra funcin, o por s misma, a ste ultimo caso se le llama recursividad. o e 4

2.2.6.

Arreglos

Los arreglos o arrays son un tipo de dato que representa un conjunto de datos de igual tipo, almacenados en posiciones contiguas de memoria. Estos arreglos, pueden tener una o varias dimensiones; decimos que un arreglo es unidimensional, cuando es semejante a un vector, bidimensional, cuando es semejante a matrices de dos dimensiones, y n-dimensional o multidimensional cuando es semejante a matrices de n dimensiones. El tamao en bytes de un array, var segn el nmero mximo de elementos y n a u u a segn el tamao del tipo de dato que posea cada elemento del arreglo. A continuacin se profundizar un u n o a poco ms en los arreglos unidimensionales y bidimensionales: a Unidimensionales: Para declarar un arreglo, se utilizan diversas formas: // Sin inicializacin o <tipo> <identificador> [tama~o]; n , o bien // Con inicializacin, donde el tama~o es opcional o n <tipo> <identificador> [] = {val1, val2, ...}; Para acceder a los elementos de un array, se ocupa la siguiente sintaxis: <identificador> [<indice>] , donde [<indice>] corresponde a un valor entre 0 y <tama~o>-1. n Los elementos de un array, puede ser referenciados con notacin de puntero, usando la siguiente o sintaxis: array+N &array[N] Segn lo anterior, el nombre del array representa la direccin de memoria en la que se encuentra el u o primer elemento de ste: e array &array[0] La caracter stica recin mencionada, es conocida como dualidad array-puntero. e Un arreglo puede ser pasado como parmetro por referencia, al pasar el nombre del arreglo en a la funcin, se pasa la direccin de todo ste, en donde los valores del array pueden ser modicao o e dos dentro de la funcin.Existen dos sintaxis para la declaracin de un array unidimensional como o o parmetro por referencia: a // Notacin array o <tipo_funcion> <identificador_funcion> (...,<tipo> [],...); // Notacin punteros o <tipo_funcion> <identificador_funcion> (...,<tipo> *,...); Cuidado!: No intentes retornar un arreglo como resultado de una funcin, si es que el arreglo ha o sido declarado en forma local, sto debido a que al terminar la ejecucin de la funcin, el contexto e o o de dicha funcin se destruye, por lo que la zona referenciada por el array deja de ser vlida. o a Bidimensionales: La disposicin en la memoria es, primero las y luego columnas. Para declarar o un arreglo bidimensional se utilizan las siguientes sintaxis:

// Sin inicializar <tipo> <identificador> [n_filas][n_columnas]; /* Con inicializacin, n_filas es opcional, o por cada fila, debe declararse un arreglo unidimensional que representa una columna de tama~o n_columnas. Si se define el nmero de filas, n u la cantidad de arrays deben ser igual a dicho nmero. */ u <tipo> <identificador> [][n_columnas] = {array1, array2, ...}; <tipo> <identificador> [n_filas][n_columnas] = {array1, array2, ...}; Para acceder a los elementos de un array bidimensional, se utiliza la siguiente sintaxis: <identificador>[<fila>][<columna>] Para declarar un arreglo bidimensional como parmetro por referencia, se indica el tamao de todas a n las dimensiones, menos la primera: <tipo_funcion> <identificador_funcion>(...,<tipo> [][n_columnas],...); Cuidado!: A pesar de que un arreglo podr considerarse como una variable cualquiera, los opa eradores de comparacin y asignacin funcionan de forma completamente distinta a la forma cono o vencional entre dos operandos comunes; en el caso de los operadores de comparacin (==, !=), se o comparan las direcciones, ms no el contenido, por lo que se hace necesario usar sentencias repetia tivas (bucles, loops), para comparar los contenidos; en el caso del operador de asignacin =, no es o aplicable a arreglos, es decir, no se puede asignar el valor de un arreglo a otro, para poder realizar una especie de asignacin, se puede copiar elemento a elemento, utilizando bucles, o bien usando o funciones de biblioteca. 2.2.7. Strings

Los strings o cadenas de caracteres son arrays de caracteres (char) que terminan con el caracter \0 (o NULL). Un string puede representarse de dos formas: 1. Entre , donde el compilador reserva automticamente un byte ms para el caracter nal. a a 2. Representacin en forma de arreglo, en donde el caracter nal se ingresa automticamente (de lo o a contrario, solo se considera como un arreglo de caracteres). Como en C no hay un tipo predenido para los strings, existen dos formas de declararlo: 1. Como arreglo: char <identificador>[] = "<string>";

2. Como puntero: char *<identificador> = "<string>";

Para declarar un string como arreglo de caracteres: // Sin inicializacin o char <identificador>[<tama~o>]; n // Con inicializacin, en donde la longitud es opcional. o char <identificador>[<tama~o>] = "<string>"; n char <identificador>[<tama~o>] = {<lista_de_caracteres_con_caracter_nulo>}; n char <identificador>[] = "<string>"; char <identificador>[] = {<lista_de_caracteres_con_caracter_nulo>};

Cuando el tamao del literal del string declarado supera al tamao denido en <tama~o>, en caso n n n de estar denido, entonces se almacena ese nmero determinado de caracteres, independiente de u que no coincida el tamao del literal con el denido. n Para declarar el string como un puntero: // Sin inicializacin o char *str; // Con inicializacin o char *str = "<string>"; Respecto a ste tipo de declaracin, es necesario comentar que luego de declarar usando la sintaxis e o de puntero, no se puede modicar el contenido luego de asignarlo. Adems, la representacin de a o arreglo en la sintaxis de puntero, no es vlida. a Para comparar los caracteres de las cadenas, es necesario emplear la funcin strcmp. o 2.2.8. Estructuras

Las estructuras son tipos de datos especiales que almacenan un conjunto de datos de distinto tipo bajo un mismo identicador. La sintaxis para declarar estructuras es la siguiente: struct <identificador> { <declaracin [e inicializacin] campo1>; o o <declaracin [e inicializacin] campo2>; o o ... <declaracin [e inicializacin] campoN>; o o }; La declaracin de una estructura debe hacerse antes y fuera de la funcin donde se use. Cualquier o o campo inicializado en la estructura, quedar inicializado por defecto para todas las variables cuyo a tipo sea struct <identificador>. Para declarar variables y funciones cuyo valores de retorno sean de tipo struct <identificador>, se usan las siguientes sintaxis: // Declaracin de variables de tipo struct o struct <identificador> <variable>; // Declaracin de funciones con valores de retorno de tipo struct o struct <identificador> <funcion>(...); Para acceder a un campo de estructura se deben considerar los operadores . y ->: Operador .: Se utiliza para acceder al campo de una variable de tipo estructura. <identificador_variable>.<campo> Operador ->: Se utiliza para acceder al campo de una variable de tipo puntero a estructura. <identificador_puntero>-><campo> Los operadores de comparacin entre variables de tipo estructura no son vlidos, debe como a pararse campo por campo para determinar si una o ms variables son o no iguales. El operador a de asignacin = sin embargo, s es vlido en cuanto a su uso, ya que al copiar una variable o a de un mismo tipo de estructura, se copian los campos uno por uno en forma interna, incluso aunque uno de los campos sea un arreglo.

2.3.

Estructura de un archivo fuente

Todo archivo fuente con extensin *.c debe cumplir con una estructura determinada para poder ser o compilada y posteriormente ejecutada como binario. Dicha estructura es exible dentro de su rigidez, y a continuacin se mostrar el porqu de lo mencionado anteriormente, adems de presentar tal estructura o a e a al estudiante, de modo que recuerde cmo programar el esqueleto de una aplicacin en C. o o Un programa escrito en C, debe poseer la siguiente estructura: <Inclusin de archivos cabeceras> o <Sentencias de precompilador> // Descriptores <Definiciones de Constantes> <Definiciones de Estructuras> <Definiciones de Tipos de Datos personalizados> <Declaracin de Firmas de Funciones personalizadas> o <Declaracin y definicin de Variables Globales> o o // Programa principal (int|void) main ([args]) { <Declaracin y definicin de variables locales> o o <Implementacin de la funcin> o o <Retorno> } // Implementacin de Funciones o <Definicin de funciones personalizadas> o Como es posible observar y comprobar (lo ms probable es que el estudiante ya lo haya comprobado en a ramos anteriores), la estructura de C a pesar de mostrar cierta rigidez, presenta exibilidad a la hora de denir y declarar ciertos elementos, esto es, muchas veces las deniciones de estructuras son realizadas antes de las deniciones de los tipos de datos, o bien, las variables globales son denidas antes de la declaracin de las funciones propias, sin embargo, se recomienda utilizar la estructura entregada en ste o e documento, para evitar discordancia y comenzar a programar en forma ms profesional. a Tambin es posible observar, que los argumentos de la funcin main presentan cierta exibilidad al moe o mento de la denicin, sto le da un caracter polimrco a la funcin principal, lo que vuelve menos o e o o r gida la forma en que se programa. Dentro de la estructura de un archivo C, es posible encontrar diversos tipos de l neas, que cumplen diversas funciones, stos tipos de l e neas son los siguientes: Las sentencias de precompilador #. Comentarios de una l nea //. Comentarios de l neas mltiples /* y */. u Sentencias simples que llevan un ; al nal. Bloques de sentencias entre { y }. L neas vac as.

2.4.

Estructura bsica de la cabecera a

Los archivos de cabecera, corresponden a archivos que contienen declaraciones directas funciones, variables u otros identicadores, son tambin llamados cheros de inclusin. La existencia de stos e o e archivos facilita la programacin, ya que se permite la modularizacin de los programas, dividindolos en o o e componentes de menor tamao, y con ello permitiendo tambin detectar errores en forma ms sencilla. n e a Cada cabecera est compuesta en s por dos archivos, el archivo de cabecera mismo, cuya extensin es a o *.h y un archivo con la denicin de las rmas existentes en el archivo de cabecera *.c, a continuacin, o o 8

la estructura bsica de ambos archivos: a Archivo de cabecera my header.h #ifndef __MY_HEADER_H__ #define __MY_HEADER_H__ // Declaraciones, firmas, etc... #endif /*__MY_HEADER_H__*/ Archivo de deniciones my header.c #include "my_header.h" // Definicin de las firmas, etc... o

2.5.

Bibliotecas estticas a

Muchas veces se observa que el programador desea ocupar frecuentemente un conjunto de funciones, por lo que podr desear agruparlas en un conjunto de cdigos fuente en un archivo objeto y luego crear a o la biblioteca (library), con los archivos objeto. Bsicamente cumple la misma funcin que la estructura a o bsica mencionada en el punto 2.4, pero conllevando un ahorro en tiempo al compilar (que en muchos a casos es muy importante). Suponga se tiene el mismo archivo *.c mencionado anteriormente: my header.c. Suponga que se tiene el mismo archivo *.h mencionado anteriormente: my header.c. Para crear una biblioteca esttica a partir a de las librer mencionadas, se utilizan los siguientes dos comandos: as $ gcc -static -c my_header.c -o my_header.o $ ar -rcs libmy_header.a my_header.o Importante!: Notar que el archivo *.a lleva como prejo la palabra lib, sto es necesario para que e GCC lo enlace en el programa a compilar. Suponga ahora, que ha creado un archivo fuente en el que ha sido usada la biblioteca my header, llamado example.c: #include <stdio.h> #include "my_header.h" int main() { // Llamado a alguna funcin de my_header o } Para hacer que ste programa compile es necesario que el header est presente, para eso se utiliza el GCC e e ag -l. $ gcc example.c -L. -lmy_header Al momento de utilizar el ag -l, GCC comenzar a buscar en el path entregado junto al ag -L, el a archivo libmy header.a.

2.6.

Punteros a funciones

Probablemente, el alumno al saber que un puntero posee direccin de memoria, debe estar golpeando o su cabeza contra la mesa o contra la pared, no hay porqu asustarse, en estos momentos, y de ahora en e adelante, se asumir que las funciones tienen una direccin. La direccin de una funcin es la del primer a o o o segmento de cdigo de la funcin. o o

Un puntero a funcin, es una variable que almacena la direccin de comienzo de la funcin; se puede o o o pensar en ellos como un alias de la funcin, pudiendo ser usados como argumentos en otras funciones. El o tipo de sta variable, corresponde a puntero-a-funcin recibiendo P parmetros y devolviendo X como e o a resultado, donde P corresponde a los parmetros que recibe la funcin apuntada, y X, el tipo de variable a o devuelta por la funcin apuntada. o Importante!: El puntero siempre debe ir encerrado entre parntesis. e A continuacin, una sintaxis general para declarar punteros a funciones: o <valor_retorno> (*<identificador>) ([<lista de tipos parmetros>]); a Por ejemplo, para mayor claridad del estudiante: int (*puntero) (int, int); En el caso de las matrices, tambin pueden aplicarse a punteros a funciones: e int (*puntero[15]) (int, int); // 15 punteros a funcin. o Importante!: Tcnicamente una matriz de punteros a funcin y una matriz de funciones son e o distintos, sin embargo, en la prctica se consideran como equivalentes, ya que cada puntero referencia al a primer segmento de cada funcin. o Para la asignacin de punteros a funcin, considere el ejemplo anterior y adems, la funcin int my func(int, o o a o int): int main() { int (*puntero) (int, int); int result; puntero = &my_func; result = puntero(1,2); return 0; } 2.6.1. Reservando memoria

Como se ha visto en el ramo de Estructura de Datos (en algunos casos Estructura de Datos y algoritmos), se asume como sabido que es posible reservar memoria en forma dinmica. A continuacin se a o mostrarn ejemplos en forma breve y a modo de repaso, de como reservar memoria en ciertos casos: a 1. Punteros simples como arreglos unidimensionales : int main() { int *matriz; int num_elementos = 10; // Se crea una matriz de 10 elementos. matriz = (int*)malloc(sizeof(int*)*num_elementos); /* Operaciones con el arreglo */ // Se libera la memoria del puntero. free(matriz) }

2. Punteros dobles como arreglos bidimensionales: int main() { int **matriz; int num_elementos = 10; 10

// Se crea una matriz de 10x10 elementos, partiendo por las filas. matriz = (int**)malloc(sizeof(int*)*num_elementos); // Se crean las columnas. for (int i = 0; i < num_elementos; i++) { matriz[i] = (int*)malloc(sizeof(int*)*num_elementos); } /* Operaciones con el arreglo */ // Se libera la memoria de cada columna. for (int i = 0; i < num_elementos; i++) { free(matriz[i]); } // Se libera la memoria del puntero. free(matriz) }

2.7.

Listas

Una lista es un tipo de dato abstracto, en el que se pueden almacenar diversos elementos de un mismo tipo, un un nmero indeterminado de veces, en forma ordenada. Una lista est compuesta por nodos, que u a representan cada uno de los elementos agregados y estn conectados a travs de punteros. Bsicamente a e a una lista se puede denir a travs de una estructura bsica como la siguiente: e a struct node { <type> data; node *next; }; // Dato // Puntero al nodo siguiente

struct list { unsigned int size; // Tama~o de la lista n node *first; // Nodo cabecera node *current; // Nodo actual }; Esta estructura bsica tiene diversas variantes, dependiendo del tipo de lista que se quiera construir, a pudiendo agregarse un puntero a un ultimo nodo, a nodos anteriores, etc. Es conveniente implementar funciones para realizar operaciones a nivel de estructura, algunas de estas operaciones son: clean(Lista): Elimina todos los elementos de la lista Lista. empty(Lista): Comprueba que la lista Lista est vac e a. push(Lista, x, n): Inserta un dato x a la lista Lista, despus del nodo apuntado por n. e delete(L,x): Elimina al nodo cuyo dato sea x de la lista Lista. node(x): Obtiene el nodo apuntado por x. data(n): Obtiene el dato almacenado por el nodo n. next(n): Obtiene la direccin siguiente del nodo apuntado por n, si n no es NULL. o Existen varios tipos de listas, de entre los cuales se encuentran: Listas simplemente enlazadas: Listas cuyos nodos apuntan slamente al nodo siguiente. o Listas doblemente enlazadas: Listas cuyos nodos apuntan al nodo siguiente y al nodo anterior. Listas circulares: Listas enlazadas en las que el ultimo nodo apunta al primero. 11

Listas circulares doblemente enlazadas: Listas doblemente enlazadas en las que el ultimo nodo apunta al primero.
*

Referencias
[1] Wikipedia - C (lenguaje de programacin) http://es.wikipedia.org/wiki/C_(lenguaje_de_programacion) o [2] Introduccin al lenguaje C - Jos D. Gutirrez Porset http://www.slideshare.net/danitxu/lenguaje-c-pdf o e e [3] Variables, Constantes y Tipos de Datos en variables-constantes-y-tipos-de-datos-en-c-presentation C http://www.slideshare.net/javi2401/

[4] Wikipedia - Archivo de Cabecera http://es.wikipedia.org/wiki/Archivo_de_cabecera [5] Archivos de cabecera archivos-de-cabecera-en-c/ en C++ http://computaciongrafica.wordpress.com/2008/03/29/

[6] Compilacin de un programa en C/C++ http://www.fismat.umich.mx/mn1/manual/node2.html o [7] Crear Bibliotecas Estticas a crear-bibliotecas-estaticas-con-gcc/ con GCC http://varrojo.algorithmia.net/2010/05/22/

[8] Puntero a funcin http://www.zator.com/Cpp/E4_2_4.htm o [9] Listas en lenguaje C http://programandoenc.over-blog.es/article-listas-en-lenguaje-c-58802324.html [10] Memoria dinmica: malloc y free sopa.dis.ulpgc.es/so/cpp/intro_c/introc75.htm a

* Cualquier

duda, sugerencia o correccin del documento, hacerla a cizambra@alumnos.inf.utfsm.cl o

12

You might also like