Professional Documents
Culture Documents
MODULO 3
Listas Enlazadas
Tarea 3
Directorio telefnico
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
*
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct DirectorioTel {
char* nombre;
char* telefono;
char* direccion;
char* email;
} Directorio;
char* leer_linea
Estructura de Datos
28/10/2013
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
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");
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