You are on page 1of 10

ESTRUCTURA DE DATOS

MODULO 3 Listas Enlazadas


Tarea 3 Directorio telefnico

Facilitador: Hugo Enrique Carrasco Rodrguez Alumno: Sal Orlando Alvarez Vargas Matrcula: A12001181 Grupo: 64 Fecha: 28 de Octubre del 2013

Estructura de Datos

28/10/2013

PROBLEMA

Debers desarrollar un programa que simule un directorio telefnico que almacene: nombre, telfono, direccin y correo electrnico de los suscriptores de una ciudad. El sistema contar con un men que muestre las siguientes opciones:

Alta de suscriptores; Baja de suscriptores; Modificacin de datos; Listado de todos los suscriptores; Consulta de suscriptores (debe permitir consultas por medio de nombre y de nmero telefnico).

CODIGO
/* * tarea3_listas_enlazadas.cpp * * Created on: 30/10/2013 * */ Author: Saul Orlando Alvarez Vargas

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

typedef struct DirectorioTel { char* nombre; char* telefono; char* direccion; char* email; } Directorio;

char* leer_linea

(const char *mensaje);

char* leer_cadena (const char *mensaje, char *cadena); float leer_decimal (const char *mensaje); int leer_campo (FILE *archivo, char *campo);

int comparar_suscriptor (const Directorio *suscriptor1, const Directorio *suscriptor2); int comparar_suscriptor_tel (const Directorio *suscriptor3, const Directorio *suscriptor4);
Pg. 2 de 10

Estructura de Datos

28/10/2013

void imprimir_suscriptor (Directorio *suscriptor, int *contador); void imprimir_en_archivo (Directorio *suscriptor, FILE *archivo); void** arreglo_insertar (void **arreglo, int *tamano, void *dato); void* arreglo_buscar (void **arreglo, int tamano, const void *dato, int (*comparar)(const void *dato1, const void *dato2)); void** arreglo_quitar (void **arreglo, int *tamano, const void *dato); void ordenar (void **arreglo, int inicio, int fin, int (*comparar)(const void *dato1, const void *dato2));

int main () { Directorio *dato, suscriptor; Directorio **arreglo = NULL; int i, tamano=0, opcion, contador=0; char campo[255], ruta[] = "directorio.tel"; FILE *archivo = fopen (ruta, "r"); if (archivo!=NULL) { while (leer_campo (archivo, campo)) { dato = (Directorio*) malloc (sizeof (Directorio)); dato->nombre = strdup (campo); leer_campo (archivo, campo); dato->telefono = strdup (campo); leer_campo (archivo, campo); dato->direccion = strdup (campo); leer_campo (archivo, campo); dato->email = strdup (campo); leer_campo (archivo, campo); arreglo = (Directorio**) arreglo_insertar ((void**)arreglo, &tamano, dato); } fclose (archivo); } do {

system("clear"); printf(" DIRECTORIO TELEFONICO\n");

printf("_________Menu Suscriptores________\n\n"); printf("(1) Altas\n"); printf("(2) Bajas\n"); printf("(3) Modificaciones\n");


Pg. 3 de 10

Estructura de Datos

28/10/2013

printf("(4) Mostrar registros.\n"); printf("(5) Consultas.\n"); printf("(6) Salir.\n\n"); printf("\tEliga una opcin[1-6]: "); scanf("%d",&opcion); getchar(); printf ("\n"); system("clear");

if (tamano==0 && opcion!=1 && opcion!=6 && opcion <6) { printf ("\nNo hay registros.\n\n"); getchar(); continue; } if (opcion<4 ) { suscriptor.nombre = leer_cadena ("\n\nIngrese el nombre del suscriptor", campo); dato = (Directorio*) arreglo_buscar ( (void**)arreglo, tamano, &suscriptor, (int(*)(const void*,const void*))comparar_suscriptor); if (dato!=NULL) imprimir_suscriptor (dato, &contador); } if (dato!=NULL && opcion==1) printf ("\n\nEl registro ya existe."); else if (dato==NULL && opcion>=2 && opcion<=4) printf ("\n\nRegistro no encontrado."); else switch (opcion) { case 1: dato = (Directorio*) malloc (sizeof (Directorio)); dato->nombre = strdup (campo); dato->telefono = leer_linea ("Ingrese el telefono"); dato->direccion = leer_linea ("Ingrese el direccion"); dato->email = leer_linea ("Ingrese el correo electronico"); arreglo = (Directorio**) arreglo_insertar ((void**)arreglo, &tamano, dato); printf ("\nRegistro agregado correctamente."); break; case 2: arreglo = (Directorio**) arreglo_quitar ((void**)arreglo, &tamano, dato); free (dato->nombre);
Pg. 4 de 10

Estructura de Datos

28/10/2013

free (dato->telefono); free (dato->direccion); free (dato->email); free (dato); printf ("\nRegistro borrado correctamente."); break; case 3: system("clear"); printf(" DIRECTORIO TELEFONICO\n"); printf("_________Menu Modificaciones________\n\n"); printf("(1) Nombre\n"); printf("(2) Telefono\n"); printf("(3) Direccion\n"); printf("(4) Email\n"); printf("\tEliga una opcin [1-4]: "); scanf("%d",&opcion); getchar();

switch(opcion){

case 1: free (dato->nombre); dato->nombre = leer_linea ("\n\nIngrese el nuevo nombre"); break; case 2: free (dato->telefono); dato->direccion = leer_linea ("\n\nIngrese el nuevo telefono"); break; case 3: free (dato->direccion); dato->telefono = leer_linea ("\n\nIngrese la nuava direccion"); break; case 4: free (dato->email); dato->email = leer_linea ("\n\nIngrese el nuevo correo electronico"); break; } printf ("\nRegistro actualizado correctamente."); break;

case 4: contador = 0;
Pg. 5 de 10

Estructura de Datos

28/10/2013

for (i=0; i<tamano; i++) imprimir_suscriptor (arreglo[i], &contador); printf ("Total de registros: %d.", contador); break;

case 5:

system("clear"); printf(" DIRECTORIO TELEFONICO\n"); printf("_________Menu Consultas________\n\n"); printf("(1) Por nombre\n"); printf("(2) Por telefono\n\n\n"); printf("\tEliga una opcin [1-2]: "); scanf("%d",&opcion); getchar();

switch(opcion) {

case 1: suscriptor.nombre = leer_cadena ("\n\nIngrese el nombre del suscriptor", campo); printf ("\n"); dato = (Directorio*) arreglo_buscar ( (void**)arreglo, tamano, &suscriptor, (int(*)(const void*,const void*))comparar_suscriptor); if (dato!=NULL) imprimir_suscriptor (dato, &contador); else printf("Error de captura..."); break; case 2: suscriptor.telefono = leer_cadena ("\n\nIngrese el telefono del suscriptor", campo); printf ("\n"); dato = (Directorio*) arreglo_buscar ( (void**)arreglo, tamano, &suscriptor, (int(*)(const void*,const void*))comparar_suscriptor_tel); if (dato!=NULL) imprimir_suscriptor (dato, &contador); else printf("Error de captura..."); break; }
Pg. 6 de 10

Estructura de Datos

28/10/2013

} if (opcion<6 && opcion>=1) { printf("\n\n"); printf("Oprima [Enter] para continuar..."); getchar(); } } while (opcion!=6); archivo = fopen (ruta, "w"); if (archivo!=NULL) { for (i=0; i<tamano; i++) imprimir_en_archivo (arreglo[i], archivo); fclose (archivo); } return EXIT_SUCCESS; }

void** arreglo_insertar (void **arreglo, int *tamano, void *dato) { arreglo = (void**) realloc (arreglo, sizeof (void*)*(*tamano+1)); arreglo[*tamano] = dato; (*tamano)++; return arreglo; }

void* arreglo_buscar (void **arreglo, int tamano, const void *dato, int (*comparar)(const void *dato1, const void *dato2)) { int i; for (i=0; i<tamano; i++) if (comparar (dato, arreglo[i])==0) return arreglo[i]; return NULL; }

void** arreglo_quitar (void **arreglo, int *tamano, const void *dato) { int i; for (i=0; i<*tamano && dato!=arreglo[i]; i++); if (i<*tamano)
Pg. 7 de 10

Estructura de Datos

28/10/2013

{ for (i++; i<*tamano; i++) arreglo[i-1]=arreglo[i]; (*tamano)--; arreglo = (void**) realloc (arreglo, sizeof (void*)*(*tamano)); } return arreglo; }

void ordenar (void **arreglo, int inicio, int fin, int (*comparar)(const void *dato1, const void *dato2)) { int menor = inicio, mayor = fin; void *pivote; if (fin>inicio) { for (pivote = arreglo[(inicio+fin)/2]; menor<=mayor; ) { for (; menor<fin && comparar (arreglo[menor], pivote)<0; menor++); for (; mayor>inicio && comparar (arreglo[mayor], pivote)>0; mayor--); if (menor<=mayor) { pivote = arreglo[menor]; arreglo[menor] = arreglo[mayor]; arreglo[mayor] = pivote; menor++; mayor--; } } if (inicio<mayor) ordenar (arreglo, inicio, mayor, comparar); if (menor<fin) ordenar (arreglo, menor, fin, comparar); } }

int comparar_suscriptor (const Directorio *suscriptor1, const Directorio *suscriptor2) { return suscriptor1==suscriptor2 ? 0 : strcmp (suscriptor1->nombre, suscriptor2->nombre); }

int comparar_suscriptor_tel(const Directorio *suscriptor3, const Directorio *suscriptor4)


Pg. 8 de 10

Estructura de Datos

28/10/2013

{ return suscriptor3==suscriptor4 ? 0 : strcmp (suscriptor3->telefono, suscriptor4->telefono); }

void imprimir_suscriptor (Directorio *suscriptor, int *contador) { printf ("\n______________________________________________________________________\n"); printf ("Nombre : %s\n", suscriptor->nombre); printf ("Telefono : %s\n", suscriptor->telefono); printf ("Direccion: %s\n", suscriptor->direccion); printf ("E-mail : %s\n", suscriptor->email); printf ("\n"); (*contador)++; }

void imprimir_en_archivo (Directorio *suscriptor, FILE *archivo) { fprintf (archivo, "%s\t", suscriptor->nombre); fprintf (archivo, "%s\t", suscriptor->telefono); fprintf (archivo, "%s\t", suscriptor->direccion); fprintf (archivo, "%s\t", suscriptor->email); }

char* leer_linea (const char *mensaje) { char linea[255]; leer_cadena (mensaje, linea); return strdup (linea); }

char* leer_cadena (const char *mensaje, char *cadena) { char *salto; printf ("%s: ", mensaje); fgets (cadena, 255, stdin); salto = strchr (cadena, '\n'); if (salto!=NULL) *salto = '\0'; return cadena; }

int leer_campo (FILE *archivo, char *campo)


Pg. 9 de 10

Estructura de Datos

28/10/2013

{ fscanf (archivo, "%[^\t\n\r]", campo); if (feof (archivo)) return 0; fgetc (archivo); return 1; }

REFERENCIAS: Instituto Consorcio Clavijero. Material del curso "Estructura de Datos" Mdulo 3. Listas Enlazadas. Contenidos temticos 3.1-31.4 en: http://cursos.clavijero.edu.mx/cursos/144_ed/modulo3/contenidos/tema3.1.html?op c=1

Pg. 10 de 10