ayudantia01-s1-2012

Upload: camilo-zambrano

Post on 05-Apr-2018

220 views

Category:

Documents


0 download

TRANSCRIPT

  • 8/2/2019 Ayudantia01-s1-2012

    1/12

    Lenguajes de Programacion

    Ayudanta 1: Recordando el pasado

    Version 1 - Semestre 1

    Camilo Zambrano Lagos

    24 de abril de 2012

    1. Introduccion

    Esta ayudanta consiste en basicamente recordar en forma superficial el uso de ciertos recursos utiliza-dos en asignaturas anteriores, como por ejemplo, las bases del lenguaje de programacion C, el uso teoricode listas y su implementacion en los lenguajes de programacion. El objetivo es que el estudiante logreincorporar todo lo ensenado de forma ntegra y permanente a su caja de herramientas de programacion,para enfrentar cualquier problema que requiera el uso de esto. En este texto se asumira que el estudianteposee conocimientos acerca de los terminos tecnicos que se emplearan de aqu en adelante (son terminosya vistos en otros ramos).

    2. El lenguaje de programacion C

    El lenguaje de programacion C, es un lenguaje creado el ano 1972 por Dennis M. Ritchie en Bell

    Labs., orientado a la implementacion de Sistemas Operativos. La filosofa de este lenguaje consiste enbuscar la simplicidad en la traduccion de cada elemento del lenguaje al lenguaje maquina, de modo dedisminuir el tiempo de ejecucion en las tareas a realizar. Inicialmente, C se desarrollo por programadorespara programadores, sin embargo en la actualidad se ha convertido en uno de los lenguajes mas populares,volviendose herramienta en contextos muy distintos a los originales.

    2.1. Caractersticas

    Es un lenguaje compilado.

    Es un lenguaje de nivel medio-bajo.

    Es case-sensitive (sensible a mayusculas).

    2.2. Componentes

    2.2.1. Variables y constantes

    Las variables y constantes corresponden a una forma mas entendible de representar de una di-reccion de memoria en donde se guardara un dato o conjunto de datos de un tipo determinado. Todarepresentacion (sea variable o constante) posee una direccion de memoria, un valor y un ambito de accesodel programa donde es valido. La diferencia la marca la posibilidad de cambio de valor de la repre-sentacion, esto significa, una variable puede cambiar su valor durante la ejecucion de la aplicacion, alcontrario de una constante en donde su valor no cambia durante la ejecucion de la misma. Se tienen dostipos de variables:

    Globales: Son declaradas despues de las cabeceras pero antes de cualquier funcion y su ambito deacceso corresponde al programa completo.

    1

  • 8/2/2019 Ayudantia01-s1-2012

    2/12

    Locales: Son declaradas dentro de una funcion, por lo que su ambito se remite solo a nivel internode la funcion (local).

    La sintaxis para la declaracion de variables puede ser de dos formas:

    [] ;

    , o bien

    [] ;

    , donde el tipo de dato puede ser predefinido o propio del lenguaje C, combinado a partir de los definidos,o bien, ser definido por el programador; el modificador corresponde a un elemento que puede indicar elambito (por defecto es local si se encuentra dentro de una funcion y global si se encuentra fuera), o bienindicar si es constante o variable (por defecto es variable), y los identificadores son b asicamente nombresque deben cumplir con la norma de identificadores para C.

    Para asignar variables se usa la siguiente sintaxis:

    = ;

    Mientras una variable no se inicialice, su valor sera indeterminado (cuidado con esto!). Una variablepuede ser inicializada durante su declaracion:

    [] = ;

    Por su parte, las constantes pueden definirse de dos formas:

    Mediante la sentencia de preprocesador #define.

    Declarando una variable con el modificador const, en donde es obligacion realizar al mismo tiempola asignacion.

    2.2.2. Expresiones y operadores

    Los operadores son elementos que indican una operacion a realizar para evaluar un valor. Losoperandos son variables y constantes. Una expresion corresponde a la combinacion entre operadoresy operandos.Ejemplos de expresiones:

    operador1 + operador2

    operador2 = operador1

    Se asume en este texto que el estudiante ha visto los operadores con los que C cuenta, a lo largo de susanos de estudio en el area de programacion.

    2.2.3. Punteros

    Basicamente un puntero, es un tipo de dato que representa una direcci on de memoria en la cual sealmacena un dato o bien se aloja una funcion. Para declarar punteros se hace uso de la siguiente sintaxis:

    * ;

    Si corresponde a void, el puntero puede apuntar a una funcion (se vera mas adelante eneste mismo texto) o bien a cualquier tipo de dato. Para acceder a una direccion de memoria se debeutilizar el operador &, as, por ejemplo se puede tener la siguiente declaracion y asignacion de un puntero:

    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 tenerla siguiente declaracion y asignacion de un puntero:

    2

  • 8/2/2019 Ayudantia01-s1-2012

    3/12

    data_t value;

    data_t value2;

    data_t * value_p;

    value_p = &value;

    value2 = (*value_p)+2;En uno o mas punteros, pueden realizarse operaciones aritmeticas (segun el tipo apuntado), de compara-cion (comparan direcciones, no contenido) o de asignacion (copia la direccion, no los contenidos, seguneso podra decirse que si se modifica el valor en un puntero, entonces el valor contenido en el punterorecien asignado tambien cambia ya que la direccion de referencia es la misma).

    Los punteros son elementos en los que hay que tener sumo cuidado al momento de programar, ya que esnecesario tener ciertas precauciones al momento de trabajar con ellos, por asuntos de acceso a la memo-ria. Es importante el tener cuidado de no acceder a zonas de memoria no declaradas por el programa,generalmente esto se traduce en errores de violacion de segmento y son errores que no se detectan almomento de compilar, solo al momento de ejecutar. Por lo anterior, es muy importante que se entiendala diferencia entre los operadores * y & para el caso de los punteros.

    2.2.4. Control de Flujo

    En el caso de este tipo de sentencias, existe una subclasificacion:

    Sentencias condicionales: Son aquellas que ejecutan una vez, una o multiples lneas de codigo,sujetas a una condicion. Dentro de esta clasificacion, se encuentran las sentencias if y switch.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 rep etitivas: Son aquellas que ejecutan una o multiples veces, una o multiples lneasde codigo, sujetas a una condicion. Dentro de esta clasificacion se encuentran las sentencias while,do-while, for.Ejemplo de sentencia while:

    // While cond is different from expr then do something.

    while (cond != expr) {

    // Do something.

    }

    3

  • 8/2/2019 Ayudantia01-s1-2012

    4/12

    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 m as o menos concreta, estos bloquespueden ser llamado una o mas veces y pueden retornar o no, un resultado. Al igual que las funciones

    matematicas, estas funciones pueden hacer uso de parametros o argumentos.

    Conociendo ya el concepto de punteros, puede mencionarse que los valores originales que una funcionrecibe como parametros pueden ser modificados en tiempo de ejecucion; a este tipo de paso de variables,se le conoce como paso p or referencia. Hay otras ocasiones, en donde el valor original se mantiene luegode ejecutarse la funcion, y lo que se hace internamente es copiar el valor del parametro en una variablelocal, que es la que se usa para realizar las operaciones necesarias; a este tipo de paso de variables, se leconoce como paso por valor.

    Es importante comentar, que dentro de un mismo archivo fuente no pueden declararse dos funcionescon el mismo identificador (polimorfismo), la unica excepcion es la funcion main.

    Dentro de un archivo fuente, se realizan tres acciones distintas relacionadas con funciones: declaraci on,

    definicion y llamada. La declaracion debe hacerse antes de la funcion main, tanto en forma de firmas (oprototipos), como en forma de archivos de cabecera. La sintaxis para la declaracion es la siguiente:

    ([]);

    Donde corresponde a void si es que no hay valor de retorno, y [] correspondea una lista de tipos (que pueden ser acompanados por identificadores, para una mayor comprension),separados por comas (,), la lista es opcional, y puede no ser especificada, o bien especificada como void.La definicion corresponde a la implementacion del codigo de la funcion, y debe hacerse posterior a lafuncion main; la sintaxis para la definicion de funciones es la siguiente:

    ([]) {

    []

    []

    [return ;]}

    Donde, a diferencia de la declaracion, [] debe llevar siempre un identificador por cadatipo en la lista. Es muy importante mencionar, que las definiciones pueden encontrarse dentro del mismoarchivo despues de main, o bien en archivos *.c aparte, o bien en archivos ya compilados.

    Para la llamada a una funcion se utiliza la siguiente sintaxis:

    ... ([])...

    Donde [] corresponde a los valores reales enviados al momento de la llamada, separadospor comas(,), estos valores reales pueden ser variables (o constantes) o bien expresiones. Una funcionpuede ser llamada desde main, otra funcion, o por s misma, a este ultimo caso se le llama recursividad.

    4

  • 8/2/2019 Ayudantia01-s1-2012

    5/12

    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 amatrices de n dimensiones. El tamano en bytes de un array, vara segun el numero maximo de elementos ysegun el tamano del tipo de dato que posea cada elemento del arreglo. A continuaci on se profundizara unpoco mas en los arreglos unidimensionales y bidimensionales:

    Unidimensionales: Para declarar un arreglo, se utilizan diversas formas:

    // Sin inicializacion

    [tama~no];

    , o bien

    // Con inicializacion, donde el tama~no es opcional

    [] = {val1, val2, ...};

    Para acceder a los elementos de un array, se ocupa la siguiente sintaxis:

    []

    , donde [] corresponde a un valor entre 0 y -1.

    Los elementos de un array, puede ser referenciados con notacion de puntero, usando la siguientesintaxis:

    array+N &array[N]

    Segun lo anterior, el nombre del array representa la direccion de memoria en la que se encuentra elprimer elemento de este:

    array &array[0]

    La caracterstica recien mencionada, es conocida como dualidad array-puntero.

    Un arreglo puede ser pasado como parametro por referencia, al pasar el nombre del arreglo enla funcion, se pasa la direccion de todo este, en donde los valores del array pueden ser modifica-dos dentro de la funcion.Existen dos sintaxis para la declaracion de un array unidimensional comoparametro por referencia:

    // Notacion array

    (..., [],...);

    // Notacion punteros

    (..., *,...);

    Cuidado!: No intentes retornar un arreglo como resultado de una funcion, si es que el arreglo hasido declarado en forma local, esto debido a que al terminar la ejecucion de la funcion, el contextode dicha funcion se destruye, por lo que la zona referenciada por el array deja de ser valida.

    Bidimensionales: La disposicion en la memoria es, primero filas y luego columnas. Para declararun arreglo bidimensional se utilizan las siguientes sintaxis:

    5

  • 8/2/2019 Ayudantia01-s1-2012

    6/12

    // Sin inicializar

    [n_filas][n_columnas];

    /* Con inicializacion, n_filas es opcional,

    por cada fila, debe declararse un arreglo unidimensional que representa

    una columna de tama~no n_columnas. Si se define el numero de filas,la cantidad de arrays deben ser igual a dicho numero. */

    [][n_columnas] = {array1, array2, ...};

    [n_filas][n_columnas] = {array1, array2, ...};

    Para acceder a los elementos de un array bidimensional, se utiliza la siguiente sintaxis:

    [][]

    Para declarar un arreglo bidimensional como parametro por referencia, se indica el tamano de todaslas dimensiones, menos la primera:

    (..., [][n_columnas],...);

    Cuidado!: A pesar de que un arreglo podra considerarse como una variable cualquiera, los op-eradores de comparacion y asignacion funcionan de forma completamente distinta a la forma con-vencional entre dos operandos comunes; en el caso de los operadores de comparacion (==, !=), secomparan las direcciones, mas no el contenido, por lo que se hace necesario usar sentencias repeti-tivas (bucles, loops), para comparar los contenidos; en el caso del operador de asignacion =, no esaplicable a arreglos, es decir, no se puede asignar el valor de un arreglo a otro, para poder realizaruna especie de asignacion, se puede copiar elemento a elemento, utilizando bucles, o bien usandofunciones 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 automaticamente un byte mas para el caracter final.

    2. Representacion en forma de arreglo, en donde el caracter final se ingresa autom aticamente (de locontrario, solo se considera como un arreglo de caracteres).

    Como en C no hay un tipo predefinido para los strings, existen dos formas de declararlo:

    1. Como arreglo:

    char [] = "";

    2. Como puntero:

    char * = "";

    Para declarar un string como arreglo de caracteres:

    // Sin inicializacion

    char [];

    // Con inicializacion, en donde la longitud es opcional.

    char [] = "";

    char [] = {};

    char [] = "";

    char [] = {};

    6

  • 8/2/2019 Ayudantia01-s1-2012

    7/12

    Cuando el tamano del literal del string declarado supera al tamano definido en , en casode estar definido, entonces se almacena ese numero determinado de caracteres, independiente deque no coincida el tamano del literal con el definido.

    Para declarar el string como un puntero:

    // Sin inicializacion

    char *str;

    // Con inicializacion

    char *str = "";

    Respecto a este tipo de declaracion, es necesario comentar que luego de declarar usando la sintaxisde puntero, no se puede modificar el contenido luego de asignarlo. Ademas, la representacion dearreglo en la sintaxis de puntero, no es valida.

    Para comparar los caracteres de las cadenas, es necesario emplear la funcion strcmp.

    2.2.8. Estructuras

    Las estructuras son tipos de datos especiales que almacenan un conjunto de datos de distinto tipobajo un mismo identificador. La sintaxis para declarar estructuras es la siguiente:

    struct {

    ;

    ;

    ...

    ;

    };

    La declaracion de una estructura debe hacerse antes y fuera de la funcion donde se use. Cualquier

    campo inicializado en la estructura, quedara inicializado por defecto para todas las variables cuyotipo sea struct .

    Para declarar variables y funciones cuyo valores de retorno sean de tipo struct ,se usan las siguientes sintaxis:

    // Declaracion de variables de tipo struct

    struct ;

    // Declaracion de funciones con valores de retorno de tipo struct

    struct (...);

    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.

    .

    Operador ->: Se utiliza para acceder al campo de una variable de tipo puntero a estructura.

    ->

    Los operadores de comparacion entre variables de tipo estructura no son validos, debe com-pararse campo por campo para determinar si una o mas variables son o no iguales. El operadorde asignacion = sin embargo, s es valido en cuanto a su uso, ya que al copiar una variablede un mismo tipo de estructura, se copian los campos uno por uno en forma interna, inclusoaunque uno de los campos sea un arreglo.

    7

  • 8/2/2019 Ayudantia01-s1-2012

    8/12

    2.3. Estructura de un archivo fuente

    Todo archivo fuente con extension *.c debe cumplir con una estructura determinada para poder sercompilada y posteriormente ejecutada como binario. Dicha estructura es flexible dentro de su rigidez, y acontinuacion se mostrara el porque de lo mencionado anteriormente, ademas de presentar tal estructura

    al estudiante, de modo que recuerde como programar el esqueleto de una aplicacion en C.

    Un programa escrito en C, debe poseer la siguiente estructura:

    // Descriptores

    // Programa principal

    (int|void) main ([args]) {

    }

    // Implementacion de Funciones

    Como es posible observar y comprobar (lo mas probable es que el estudiante ya lo haya comprobado enramos anteriores), la estructura de C a pesar de mostrar cierta rigidez, presenta flexibilidad a la hora dedefinir y declarar ciertos elementos, esto es, muchas veces las definiciones de estructuras son realizadasantes de las definiciones de los tipos de datos, o bien, las variables globales son definidas antes de ladeclaracion de las funciones propias, sin embargo, se recomienda utilizar la estructura entregada en este

    documento, para evitar discordancia y comenzar a programar en forma mas profesional.Tambien es posible observar, que los argumentos de la funcion main presentan cierta flexibilidad al mo-mento de la definicion, esto le da un caracter polimorfico a la funcion principal, lo que vuelve menosrgida la forma en que se programa.

    Dentro de la estructura de un archivo C, es posible encontrar diversos tipos de lneas, que cumplendiversas funciones, estos tipos de lneas son los siguientes:

    Las sentencias de precompilador #.

    Comentarios de una lnea //.

    Comentarios de lneas multiples /* y */.

    Sentencias simples que llevan un ; al final.Bloques de sentencias entre { y }.

    Lneas vacas.

    2.4. Estructura basica de la cabecera

    Los archivos de cabecera, corresponden a archivos que contienen declaraciones directas funciones,variables u otros identificadores, son tambien llamados ficheros de inclusion. La existencia de estosarchivos facilita la programacion, ya que se permite la modularizacion de los programas, dividiendolos encomponentes de menor tamano, y con ello permitiendo tambien detectar errores en forma mas sencilla.Cada cabecera esta compuesta en s por dos archivos, el archivo de cabecera mismo, cuya extension es*.h y un archivo con la definicion de las firmas existentes en el archivo de cabecera *.c, a continuacion,

    8

  • 8/2/2019 Ayudantia01-s1-2012

    9/12

    la estructura basica de ambos archivos:

    Archivo de cabecera my header.h

    #ifndef __MY_HEADER_H__

    #define __MY_HEADER_H__

    // Declaraciones, firmas, etc...

    #endif /*__MY_HEADER_H__*/

    Archivo de definiciones my header.c

    #include "my_header.h"

    // Definicion de las firmas, etc...

    2.5. Bibliotecas estaticas

    Muchas veces se observa que el programador desea ocupar frecuentemente un conjunto de funciones,por lo que podra desear agruparlas en un conjunto de codigos fuente en un archivo objeto y luego crearla biblioteca (library), con los archivos objeto. Basicamente cumple la misma funcion que la estructurabasica mencionada en el punto 2.4, pero conllevando un ahorro en tiempo al compilar (que en muchoscasos es muy importante).Suponga se tiene el mismo archivo *.c mencionado anteriormente: my header.c. Suponga que se tiene elmismo archivo *.h mencionado anteriormente: my header.c. Para crear una biblioteca estatica a partirde las libreras mencionadas, se utilizan los siguientes dos comandos:

    $ 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 prefijo la palabra lib, esto es necesario para que

    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, llamadoexample.c:

    #include

    #include "my_header.h"

    int main() {

    // Llamado a alguna funcion de my_header

    }

    Para hacer que este programa compile es necesario que el header este presente, para eso se utiliza el GCC

    flag -l.

    $ gcc example.c -L. -lmy_header

    Al momento de utilizar el flag -l, GCC comenzara a buscar en el path entregado junto al flag -L, elarchivo libmy header.a.

    2.6. Punteros a funciones

    Probablemente, el alumno al saber que un puntero posee direccion de memoria, debe estar golpeandosu cabeza contra la mesa o contra la pared, no hay porque asustarse, en estos momentos, y de ahora enadelante, se asumira que las funciones tienen una direccion. La direccion de una funcion es la del primersegmento de codigo de la funcion.

    9

  • 8/2/2019 Ayudantia01-s1-2012

    10/12

    Un puntero a funcion, es una variable que almacena la direccion de comienzo de la funcion; se puedepensar en ellos como un alias de la funcion, pudiendo ser usados como argumentos en otras funciones. Eltipo de esta variable, corresponde a puntero-a-funcion recibiendo P parametros y devolviendo X comoresultado, donde P corresponde a los parametros que recibe la funcion apuntada, y X, el tipo de variable

    devuelta por la funcion apuntada.

    Importante!: El puntero siempre debe ir encerrado entre parentesis.

    A continuacion, una sintaxis general para declarar punteros a funciones:

    (*) ([]);

    Por ejemplo, para mayor claridad del estudiante:

    int (*puntero) (int, int);

    En el caso de las matrices, tambien pueden aplicarse a punteros a funciones:

    int (*puntero[15]) (int, int); // 15 punteros a funcion.

    Importante!: Tecnicamente una matriz de punteros a funcion y una matriz de funciones sondistintos, sin embargo, en la practica se consideran como equivalentes, ya que cada puntero referencia alprimer segmento de cada funcion.

    Para la asignacion de punteros a funcion, considere el ejemplo anterior y ademas, la funcion int my func(int,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 algo-ritmos), se asume como sabido que es posible reservar memoria en forma dinamica. A continuacion semostraran ejemplos en forma breve y a modo de repaso, de como reservar memoria en ciertos casos:

    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

  • 8/2/2019 Ayudantia01-s1-2012

    11/12

    // 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 mismotipo, un un numero indeterminado de veces, en forma ordenada. Una lista esta compuesta por nodos, querepresentan cada uno de los elementos agregados y estan conectados a traves de punteros. Basicamenteuna lista se puede definir a traves de una estructura basica como la siguiente:

    struct node {

    data; // Dato

    node *next; // Puntero al nodo siguiente

    };

    struct list {

    unsigned int size; // Tama~no de la lista

    node *first; // Nodo cabeceranode *current; // Nodo actual

    };

    Esta estructura basica tiene diversas variantes, dependiendo del tipo de lista que se quiera construir,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 estasoperaciones son:

    clean(Lista): Elimina todos los elementos de la lista Lista.

    empty(Lista): Comprueba que la lista Lista este vaca.

    push(Lista, x, n): Inserta un dato x a la lista Lista, despues del nodo apuntado por n.

    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 direccion siguiente del nodo apuntado por n, si n no es NULL.

    Existen varios tipos de listas, de entre los cuales se encuentran:

    Listas simplemente enlazadas: Listas cuyos nodos apuntan solamente al nodo siguiente.

    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

  • 8/2/2019 Ayudantia01-s1-2012

    12/12

    Listas circulares doblemente enlazadas: Listas doblemente enlazadas en las que el ultimo nodoapunta al primero.

    *

    Referencias

    [1] Wikipedia - C (lenguaje de programacion) http://es.wikipedia.org/wiki/C_(lenguaje_de_programacion)

    [2] Introduccion al lengua je C - Jose D. Gutierrez Porset http://www.slideshare.net/danitxu/lenguaje-c-pdf

    [3] Variables, Constantes y Tipos de Datos en C http://www.slideshare.net/javi2401/variables-constantes-y-tipos-de-datos-en-c-presentation

    [4] Wikipedia - Archivo de Cabecera http://es.wikipedia.org/wiki/Archivo_de_cabecera

    [5] Archivos de cabecera en C++ http://computaciongrafica.wordpress.com/2008/03/29/archivos-de-cabecera-en-c/

    [6] Compilacion de un programa en C/C++ http://www.fismat.umich.mx/mn1/manual/node2.html

    [7] Crear Bibliotecas Estaticas con GCC http://varrojo.algorithmia.net/2010/05/22/crear-bibliotecas-estaticas-con-gcc/

    [8] Puntero a funcion http://www.zator.com/Cpp/E4_2_4.htm

    [9] Listas en lenguaje C http://programandoenc.over-blog.es/article-listas-en-lenguaje-c-58802324.html

    [10] Memoria dinamica: malloc y free sopa.dis.ulpgc.es/so/cpp/intro_c/introc75.htm

    *Cualquier duda, sugerencia o correccion del documento, hacerla a [email protected]