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