//prog 30
//lista simplemente enlazada
#include<stdio.h>
#include<string.h>
#include<conio.h>
#include<ctype.h>
#include<dos.h>
#include<stdlib.h>
#include<a:portada.h>
# define MAX 6
int i;
int borrando=0;
void intro_ficha(void);
void lista_ficha(void);
void muestra_ficha(void);
void borra_ficha(void);
void almacena_datos(void);
void lee_datos(void);
void asigna_memoria(void);
void visu_ficha(struct agenda*);////////////////////////
struct agenda *display_ficha(char *n);
struct agenda *busca(char *inbuf);
struct agenda *primero,*nuevo,*indice;
//////////////////////////////////
struct agenda{
char nombre[30];
char direccion[50];
char telefono [10];
struct agenda *siguiente;//apunta al siguiente elemento de la lista
};
//////////////////////////////////
void asigna_memoria(){
nuevo=(struct agenda*)malloc(sizeof(struct agenda));
if(nuevo==NULL){
gotoxy(2,13);printf("Espacio de memoria insuficiente");
getche();
for(i=2;i<=79;i++){
gotoxy(i,13);printf(" ");}
return;
}
if(primero==(struct agenda*)NULL)
primero=indice=nuevo;
else{
indice=primero;
while(indice->siguiente!=(struct agenda*)NULL)
indice=indice->siguiente;
indice->siguiente=nuevo;
indice=nuevo;}}
/////////////////////////////////////////////////////
void intro_ficha(){
asigna_memoria();
for(i=2;i<=79;i++){
gotoxy(i,13);printf(" ");}
gotoxy((80-19)/2,13);printf("Agregando Datos!!!!");
gotoxy(5,16);printf("Nombre: ");
fflush(stdin);
gets(indice->nombre);
gotoxy(5,17);printf("Direccion: ");
fflush(stdin);
gets(indice->direccion);
gotoxy(5,18);printf("Telefono: ");
fflush(stdin);
gets(indice->telefono);
indice->siguiente=(struct agenda*)NULL;
}
/////////////////////////////////////////
void lista_ficha(void){
if(primero==(struct agenda*)NULL){
for(i=2;i<=79;i++){
gotoxy(i,13);printf(" ");}
gotoxy((80-15)/2,13);printf("Lista vacia!!!!");
getche();//retener mensaje
return;}
indice=primero;
do{
visu_ficha(indice);
indice=indice->siguiente;
}while(indice!=(struct agenda*)NULL);
}
////////////////////////////////////////////////
void muestra_ficha(void){
char inbuf[30];
for(i=2;i<=79;i++){
gotoxy(i,13);printf(" ");}
gotoxy(5,13);printf("Mostrar la ficha con Nombre: ");
fflush(stdin);
gets(inbuf);
display_ficha(inbuf);}
/////////////////////////////////////////////////////
void visu_ficha(struct agenda *visu){
for(i=2;i<=79;i++){
gotoxy(i,13);printf(" ");
gotoxy(i,16);printf(" ");
gotoxy(i,17);printf(" ");
gotoxy(i,18);printf(" ");}
gotoxy(30,13);printf("Mostrando datos!!!!");
gotoxy(5,16);printf("Nombre: %s",visu->nombre);
gotoxy(5,17);printf("Direccion: %s",visu->direccion);
gotoxy(5,18);printf("Telefono: %s",visu->telefono);
if(borrando==0){
hori(22);
gotoxy(26,23);printf("Presiona CUALQUIER tecla para continuar");
getche();}
}
////////////////////////////////////////////////
void borra_ficha(){
struct agenda *borra;
char inbuf[30];
for(i=2;i<=79;i++){
gotoxy(i,13);printf(" ");}
gotoxy(5,13);printf("Borra la ficha con el nombre: ");
fflush(stdin);
gets(inbuf);
borra= ((struct agenda*)display_ficha(inbuf));
if(borra==(struct agenda*)NULL)
return;
for(i=2;i<=79;i++){
gotoxy(i,13);printf(" ");}
gotoxy(5,13);printf("Deseas borrar esta ficha? s/n: ");
switch(toupper(getche())){
case 'N':return;
case 'S':break;}
if(borra==primero)
primero=primero->siguiente;
else{
indice=primero;
while(indice->siguiente!=borra)
indice=indice->siguiente;
indice->siguiente=borra->siguiente;
}
free(borra);}
//////////////////////////////////////////////////////
struct agenda *display_ficha(char *n){
struct agenda *ficha;
for(i=2;i<=79;i++){
gotoxy(i,13);printf(" ");}
gotoxy((80-18)/2,13);printf("Buscando ficha!!!!");
if(!(ficha=(struct agenda *)busca(n))){
for(i=2;i<=79;i++){
gotoxy(i,13);printf(" ");}
gotoxy((80-23)/2,13);printf("Ficha no encontrada!!!!");
getche();
return NULL;
}
else
visu_ficha(ficha);
return ficha;}
///////////////////////////////////////////////////
struct agenda *busca(char *inbuf){
indice=primero;
while(indice!=NULL){
if(!strcmp(inbuf,indice->nombre))return indice;
indice=indice->siguiente;}
return NULL;}
///////////////////////////////////////////////
void intro(){
clrscr();
margenes();
gotoxy(3,2);printf("Programa No: 30");
hori(3);
gotoxy(3,4);printf("Lista enlazada");
gotoxy(3,9);printf("Descripcion:");
gotoxy(3,10);printf("Este programa maneja una lista enlazada");
hori(22);
gotoxy(20,23);printf("Presiona Cualquier tecla para continuar");
getche();
}
/////////////////////////////////////////
main(){
clrscr();
portada();
intro();
for(;;){
clrscr();
borrando=0;
int opc;
margenes();
gotoxy((80-14)/2,2);cprintf("<--@G3|\|d@-->");
hori(3);
gotoxy((80-22)/2,4);cprintf("1.- Agregar");
gotoxy((80-22)/2,5);cprintf("2.- Listar todos");
gotoxy((80-22)/2,6);cprintf("3.- Mostrar por nombre");
gotoxy((80-22)/2,7);cprintf("4.- Borrar por nombre");
gotoxy((80-22)/2,8);cprintf("5.- Guargar a disco");
gotoxy((80-22)/2,9);cprintf("6.- Leer de disco");
gotoxy((80-22)/2,10);cprintf("7.- Salir");
hori(12);
hori(14);
gotoxy((80-22)/2,13);cprintf("Elige tu opcion: ");
scanf("%d",&opc);
switch(opc){
case 1:
intro_ficha();
break;
case 2:
lista_ficha();
break;
case 3:
muestra_ficha();
break;
case 4:
borrando=1;
borra_ficha();
break;
case 5:
almacena_datos();
break;
case 6:
lee_datos();
break;
case 7:
exit(0);
break;}
}
}
////////////////////////////////////////////////
void almacena_datos(void){
FILE *ap;
char *ruta=NULL;
int c=0;
for(i=2;i<=79;i++){
gotoxy(i,13);printf(" ");}
gotoxy((80-21)/2,13);printf("Guardando a disco!!!!");
gotoxy(5,16);printf("Directorio: ");
fflush(stdin);
gets(ruta);
if((ap=fopen(ruta,"wb"))==NULL){
for(i=2;i<=79;i++){
gotoxy(i,13);printf(" ");}
gotoxy((80-31)/2,13);printf("El archivo no se puede abrir!!!!");
getche();
return;}
indice=primero;
for(i=2;i<=79;i++){
gotoxy(i,13);printf(" ");}
do{
//efecto
if(c==5){
c=0;}
if(c==0||c==3){
gotoxy(39,13);printf("|");}
if(c==1){
gotoxy(39,13);printf("/");}
if(c==2){
gotoxy(39,13);printf("-");}
if(c==4){
gotoxy(39,13);printf("\\");}
fwrite(indice,sizeof(struct agenda),1,ap);
indice=indice->siguiente;
c++;
}while(indice!=(struct agenda*)NULL);
fclose(ap);}
////////////////////////////////////////////
void lee_datos(void){
FILE *ap;
char *ruta=NULL;
for(i=2;i<=79;i++){
gotoxy(i,13);printf(" ");}
gotoxy((80-21)/2,13);printf("Leer datos de disco!!!!");
gotoxy(5,16);printf("Directorio: ");
fflush(stdin);
gets(ruta);
if((ap=fopen(ruta,"rb"))==NULL){
for(i=2;i<=79;i++){
gotoxy(i,13);printf(" ");}
gotoxy((80-31)/2,13);printf("El archivo no se puede abrir!!!!");
getche();
return;}
asigna_memoria();
do{
indice->siguiente=nuevo;
indice=nuevo;
fread(indice,sizeof(struct agenda),1,ap);
nuevo=(struct agenda*)malloc(sizeof(struct agenda));
}while(indice->siguiente!=NULL);
fclose(ap);
}