domingo, 25 de abril de 2010

PROYECTO 4 "LISTAS SIMPLEMENTE ENLAZADAS"


En Ciencias de la Computación, una lista enlazada es una de las estructuras de datos fundamentales, y puede ser usada para implementar otras estructuras de datos. Consiste en una secuencia de nodos, en los que se guardan campos de datos arbitrarios y una o dos referencias (punteros) al nodo anterior y/o posterior. El principal beneficio de las listas enlazadas respecto a los array convencionales es que el orden de los elementos enlazados puede ser diferente al orden de almacenamiento en la memoria o el disco, permitiendo que el orden de recorrido de la lista sea diferente al de almacenamiento.

Explicación:

Apuntador toma el valor de Inicio, después ve si la condición cumple para efectuar un Ciclo mientras Apuntador sea diferente de 0, si cumple lo que hace es que despliega la Info[Apuntador], después Apuntador toma el valor de Indice[Apuntador] (El cual nos indica el siguiente nodo que sigue en la lista) y hace esto hasta que Apuntador sea igual a 0 (Cuando llega a este punto a llegado al fin de la Lista Enlazada).

Algoritmo:

Recorrido(Inicio, Info, Indice)

Apuntador ←- Inicio

Repetir mientras Apuntador ≠ Nill

Imprimir Info[Apuntador]

Apuntador ←- Indice[Apuntador]

Fin del ciclo

Salir

Cabe destacar que se pueden realizar algunas operaciones en las listas enlazadas como:

Inserción en una lista vacía.


Etapas:
  • asignación de memoria para el nuevo elemento
  • rellenar el campo de datos del nuevo elemento
  • el puntero siguiente del nuevo elemento apuntará hacia NULL (ya que la inserción es hecha en una lista vacía se utiliza la dirección del puntero inicio que vale NULL)
  • los punteros inicio y fin apuntaran hacia el nuevo elemento
  • el tamaño es actualizado













Inserción al inicio de la lista


Etapas:
  • asignación de memoria al nuevo elemento
  • rellenar el campo de datos del nuevo elemento
  • el puntero siguiente del nuevo elemento apunta hacia el primer elemento
  • el puntero inicio apunta hacia el nuevo elemento
  • el puntero fin no cambia
  • el tamaño es incrementado

Inserción al final de la lista


Etapas:
  • asignación de memoria al nuevo elemento
  • rellenar el campo de datos del nuevo elemento
  • el puntero siguiente del ultimo elemento apunta hacia el nuevo elemento
  • el puntero fin apunta hacia el nuevo elemento
  • el puntero inicio no cambia
  • el tamaño es incrementado



El pseodocodigo se realizo con el compilador dev c++
#include

struct _agenda {
char nombre[20];
char telefono[12];
char habitacion[12];
struct _agenda *siguiente;
};

struct _agenda *primero, *ultimo;

void mostrar_menu() {
printf("\n\nMenu:\n=====\n\n");
printf("1.- Anadir Huesped(ALTA)\n");
printf("2.- Mostrar lista de huespedes\n");
printf("3.- Salir\n\n");
printf("Escoge una opcion: ");fflush(stdout);
}

/* Con esta función añadimos un elemento al final de la lista */
void anadir_elemento() {
struct _agenda *nuevo;

/* reservamos memoria para el nuevo elemento */
nuevo = (struct _agenda *) malloc (sizeof(struct _agenda));
if (nuevo==NULL) printf( "No hay memoria disponible!\n");

printf("\nAgregar Huesped:\n");
printf("\nIngrese Informacion\n");
printf("Nombre: "); fflush(stdout);
gets(nuevo->nombre);
printf("Telefono: "); fflush(stdout);
gets(nuevo->telefono);
printf("Asignar Habitacion: "); fflush(stdout);
gets(nuevo->habitacion);

/* el campo siguiente va a ser NULL por ser el último elemento
de la lista */
nuevo->siguiente = NULL;

/* ahora metemos el nuevo elemento en la lista. lo situamos
al final de la lista */
/* comprobamos si la lista está vacía. si primero==NULL es que no
hay ningún elemento en la lista. también vale ultimo==NULL */
if (primero==NULL) {
printf( "Registrado\n");
primero = nuevo;
ultimo = nuevo;
}
else {
/* el que hasta ahora era el último tiene que apuntar al nuevo */
ultimo->siguiente = nuevo;
/* hacemos que el nuevo sea ahora el último */
ultimo = nuevo;
}
}

void mostrar_lista() {
struct _agenda *auxiliar; /* lo usamos para recorrer la lista */
int i;

i=0;
auxiliar = primero;
printf("\nMostrando la lista completa:\n");
while (auxiliar!=NULL) {
printf( "Nombre: %s, Telefono: %s,Habitacion: %s\n",
auxiliar->nombre,auxiliar->telefono,auxiliar->habitacion);
auxiliar = auxiliar->siguiente;
i++;
}
if (i==0) printf( "\nLa lista esta vacia!!\n" );
}

int main() {
char opcion;

primero = (struct _agenda *) NULL;
ultimo = (struct _agenda *) NULL;
do {
mostrar_menu();
opcion = getch();
switch ( opcion ) {
case '1': anadir_elemento();
break;
case '2': mostrar_lista(primero);
break;
case '3': exit( 1 );
default: printf( "Opcion no valida\n" );
break;
}
} while (opcion!='3');
}



Mi colaboracion con el equipo fue la realizacion de la presentacion asi como en la modificacion del pseoudocodigo y considero que mi trabajo estuvo bien.
En la realizacion de las diapositivas, siento que me hace falta mejorar en en el pseudocodigo,ayudo a los demas con aportaciones que creo son de apoyo para el trabajo, el trabajo lo coordina mi compañero Rodolfo Aguire, el papel que desempeño es aportando y en la realizacion de las diapositivas.
El hacer estos trabajos me deja una satisfacción personal ya que estoy aprendiendo cada dia cosas interesantes ya que en el futuro me seran de gran utilidad para mi desempeño academico.



BINLIOGRAFIA

http://html.rincondelvago.com/estructura-de-datos_7.html
http://es.kioskea.net/faq/2842-la-lista-enlazada-simple
http://www.monografias.com/trabajos28/listas-enlazadas/listas-enlazadas.shtml