Practica _7

Anuncio
Practica 7 Algoritmos y lenguajes de programación
Felipe Humberto Mendoza Lira
#include<stdlib.h>
#include<stdio.h>
#include<conio.h>
typedef struct NODE {char *value1; char *value2; struct NODE *fwd; struct NODE *bwd;}
NODE;
#define true 1
#define false 0
#define FILENAME "directorio.txt"
char *get_cadena(int size);
struct NODE * tll_insert(struct NODE **actual, int lugar);
void tll_abrir(struct NODE **root,char *filename);
void tll_guardar(struct NODE *node,char *filename);
void tll_mostrar(struct NODE *node);
/******************************************************************************/
int main(void)
{
struct NODE *root, *nuevo;
int lugar, opcion;
int salir=false;
root=NULL;
char *filename=FILENAME;
do
{
/* muestra la lista en pantalla */
system("cls");
printf("La lista telefonica es:\n\n");
tll_mostrar(root);
/* solicita el lugar donde sera insertado el nodo */
printf("\nQue deseas hacer?\n\n");
printf("[1] Aqregar nuevo elemento\n");
printf("[2] Abrir lista\n");
printf("[3] Guardar lista\n");
printf("[4] Salir\n");
opcion = atoi(get_cadena(3));
switch(opcion)
{
case 1:
printf("\nEn que posicion deseas agregar el proximo?\n");
lugar = atoi(get_cadena(3));
if (lugar>0)
{
/* nuevo es el nodo insertado */
nuevo = tll_insert(&root,lugar);
/* guarda los valores en nuevo nodo */
system("cls");
printf("Nueva entrada\n");
nuevo->value1 = get_cadena(20);
printf("\nTelefono\n");
nuevo->value2 = get_cadena(12);
}
break;
case 2:
tll_abrir(&root,filename);
break;
case 3:
1
Practica 7 Algoritmos y lenguajes de programación
Felipe Humberto Mendoza Lira
tll_guardar(root,filename);
break;
case 4:
salir=true;
break;
}
}
while (!salir);
return 0;
}
/******************************************************************************/
/* ingresa una cadena de n caracteres
*/
char *get_cadena(int size)
{
int i = 1;
char *cadena;
/* reserva memoria para la cadena */
cadena = (char*)calloc((size+1),sizeof(char));
/* mientras no se ingrese ningun valor */
while ((cadena[0] = getchar())=='\n');
/* guarda la cadena de caracteres hasta el tamaño especificado */
while ((cadena[i] = getchar())!='\n')
{
i++;
if (i==size) {while ((getchar())!='\n'); break;}
}
/* ingresa un ultimo caracter (indica que la cadena termina) */
cadena[i] = '\0';
/* retorna la cadena de caracteres */
return cadena;
}
/******************************************************************************/
/* guarda el contenido de la lista telefonica
*/
void tll_guardar(struct NODE *node,char *filename)
{
FILE *file;
file=fopen(filename,"w+");
while (node != NULL)
{
fprintf(file,"%-20s %12s\n",node->value1, node->value2);
node = node->fwd;
}
fclose(file);
}
/******************************************************************************/
/* guarda el contenido de la lista telefonica
*/
void tll_abrir(struct NODE **root,char *filename)
{
FILE *file;
struct NODE *nuevo;
file=fopen(filename,"r+");
*root=NULL;
int n=1;
while (!feof(file))
{
nuevo = tll_insert(root,n++);
if (*root==NULL)
*root=nuevo;
nuevo->value1 = (char*)calloc((20+1),sizeof(char));
2
Practica 7 Algoritmos y lenguajes de programación
Felipe Humberto Mendoza Lira
nuevo->value2 = (char*)calloc((12+1),sizeof(char));
fscanf(file,"%20s %12s\n",nuevo->value1,nuevo->value2);
}
fclose(file);
return;
}
/******************************************************************************/
/* muestra el contenido de la lista telefonica
*/
void tll_mostrar(struct NODE *node)
{
int n=1;
/* mientras no llege al final muestra el valor */
/* de las variables contenidas en el n node al
*/
/* que apunta *node y pasa al siguiente nodo
*/
while (node != NULL)
{
printf("%2d. %-20s %12s\n", n++, node->value1, node->value2);
node = node->fwd;
}
}
/******************************************************************************/
/* inserta un nodo en una lista enlazada doble en
*/
/* un n lugar y retorna un puntero a este nodo
*/
struct NODE * tll_insert(struct NODE **actual, int lugar)
{
struct NODE *nuevo;
/* reserva la memoria del nuevo nodo
*/
nuevo = (struct NODE *)calloc(1,sizeof(struct NODE));
/* en caso de ser el primer elemento */
if (*actual==NULL)
{
*actual=nuevo;
nuevo->bwd = NULL;
nuevo->fwd = NULL;
return nuevo;
}
/* avanza en la lista mientras no llege */
/* a la posicion deseada o al final
*/
while ((--lugar)>0)
{
if (((*actual)->fwd)!=NULL)
actual = &(*actual)->fwd;
else
break;
}
/* en caso de agregarse al final */
if (lugar!=0)
{
nuevo->fwd = NULL;
nuevo->bwd = *actual;
(*actual)->fwd = nuevo;
return nuevo;
}
/* agreaga nodos entremedio */
nuevo->fwd = *actual;
nuevo->bwd = (*actual)->bwd;
(*actual)->bwd = *actual = nuevo;
return nuevo;
}
/******************************************************************************/
3
Descargar