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);

Pg. 4 de 10

Estructura de Datos

28/10/2013

free (dato->nombre);
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;

Pg. 5 de 10

Estructura de Datos

28/10/2013

case 4:
contador = 0;
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
Pg. 6 de 10

Estructura de Datos

28/10/2013

printf("Error de captura...");
break;
}
}
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)
{
Pg. 7 de 10

Estructura de Datos

28/10/2013

int i;
for (i=0; i<*tamano && dato!=arreglo[i]; i++);
if (i<*tamano)
{
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);
Pg. 8 de 10

Estructura de Datos

28/10/2013

}
int comparar_suscriptor_tel(const Directorio *suscriptor3, const Directorio *suscriptor4)
{
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;
Pg. 9 de 10

Estructura de Datos

28/10/2013

}
int leer_campo (FILE *archivo, char *campo)
{
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?
opc=1

Pg. 10 de 10

You might also like