Ver Mensaje Individual
  #1 (permalink)  
Antiguo 21/07/2016, 15:18
matiri90
 
Fecha de Ingreso: abril-2016
Ubicación: Cordoba
Mensajes: 22
Antigüedad: 8 años, 7 meses
Puntos: 1
Exclamación Archivos y Listas enlazadas simples en C

Hola gente. Hace poco que estoy en esto de C y estaba tratando de usar archivos y llenar un fichero con datos que estan en una Lista enlazada simple.
Por mucho que intente y lei, no logre encontrar la solucion. Lo mas cerca que he estado es lo que voy a subir.. Desde ya, gracias!

Código:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* CONTROL DE MEMORIA
	Persona *aux;
	if ((aux = (Persona *) malloc (sizeof (Persona))) == NULL){
        return -1;
	}
*/
typedef struct TipoFecha{
	int dia;
	int mes;
	int anio;
}TFecha;

typedef struct TipoAmigo{
	char apellido[20];
	char nombre[20];
	char email[30];
	char celular[15];
	TFecha fecNac;
	char flag;
}Amigo;

typedef struct ElementoLista{
	Amigo  dato;
	struct Persona *sig;
}Persona;

typedef struct ListaIdentificar {
    Persona *inicio;
    Persona *fin;
    int cantidad;
}Lista;


int guardarArchivo(FILE *f,Lista *l);
int mostrarArchivo(FILE *f);


void inicializacion (Lista *l);
int insInicioLista (Lista *l,Amigo p);
int insEnListaVacia (Lista *l,Amigo p);


int agregarAmigo(Lista *l);
Amigo pedirAmigo();
int estaAmigo(Lista *l,Amigo p);
int ordenar(Lista *l);
		
int estaAmigo(Lista *l,Amigo p);


void mostrarDatos(Lista *l);
void mostrarAmigo(Amigo p);


void main(){
	Lista *lista;
	if ((lista = (Persona *) malloc (sizeof (Persona))) == NULL){
        return -1;
	}
	
	inicializacion(lista);
	int pos,control;
    do{
    	if (lista->cantidad==0){
        	agregarAmigo(lista);
    	}else if(lista->cantidad==1){
    		agregarAmigo(lista);
		}else{
			agregarAmigo(lista);
		}
		printf("\n\n");
		printf("Seguir agregando?\n");
		scanf("%i",&control);
        if (control==1){
        	ordenar(lista);
        	mostrarDatos(lista);
        	printf("\n\n\n\t");
        	system("pause");
		}else{
			printf("\n\n\t");
			printf("Gracias por utilizar este programa.\n");
		}
	}while (control==1);
	/*-------------------PRUEBA DE ARCHIVO-----------*/
	printf("Vengooo\n");
	FILE *f1,*f2;
	printf("Sigooooo\n");
	//if(existeArchivo("agenda1")==0){
		f1 = fopen ("agenda1.txt", "w+b");
//		f2 = fopen ("fichero2.dat", "wb");
		if(guardarArchivo(f1,lista)==-1){
			printf("\nNo se pudo guardar.");
		}else{
			printf("Archivo Guardado con Exito.");
			mostrarArchivo(f1);
		}
		fclose(f1);
}



void inicializacion (Lista *l){
	l->fin=NULL;
	l->inicio=NULL;
	l->cantidad=0;
}


int agregarAmigo(Lista *l){
	Amigo persona=pedirAmigo();
	int encontrado=estaAmigo(l,persona);
	if (encontrado==-1){
		return encontrado;
	}else if(l->cantidad==0){
		insEnListaVacia(l,persona);
	}else{
		insInicioLista(l,persona);
	}
}


Amigo pedirAmigo(){
	Amigo aux;
	do{
		printf("\nIngrese el apellido de su amigo.\n");
		fflush(stdin);
        gets(aux.apellido);
        printf("\nEs %s",aux.apellido);
	}while (strlen(aux.apellido)>20);
		do{
		printf("\nIngrese el nombre de su amigo.\n");
		fflush(stdin);
        gets(aux.nombre);
	}while (strlen(aux.nombre)>20);
		do{
		printf("\nIngrese el email de su amigo.\n");
		fflush(stdin);
        gets(aux.email);
	}while (strlen(aux.email)>30);
		do{
		printf("\nIngrese el celular de su amigo.\n");
		fflush(stdin);
        gets(aux.celular);
	}while (strlen(aux.celular)>15);
	printf("\nFecha de cumpleaños de su amigo.");
	do{	
		printf("\nIngrese el anio de nacimiento: ");
		scanf("%i",&aux.fecNac.anio);
	}while ((aux.fecNac.anio>2016)||(aux.fecNac.anio<1900));
	do{	
		printf("\nIngrese el mes de nacimiento: ");
		scanf("%i",&aux.fecNac.mes);
	}while ((aux.fecNac.mes>12)||(aux.fecNac.mes<1));
	do{	
		printf("\nIngrese el dia de nacimiento: ");
		scanf("%i",&aux.fecNac.dia);
	}while ((aux.fecNac.dia>31)||(aux.fecNac.dia<1));
	aux.flag=' ';
	return aux;
}


int estaAmigo(Lista *l,Amigo p){
	int i=1;
	Persona *aux;
	if ((aux = (Persona *) malloc (sizeof (Persona))) == NULL){
        return -1;
	}
	if(l->cantidad==0){
		return 0;
	}else {
		aux=l->inicio;
		while (i<=l->cantidad){
			if(strcmpi(aux->dato.apellido,p.apellido)!=0){
				i++;
				aux=aux->sig;
			}else if(strcmpi(aux->dato.nombre,p.nombre)!=0){
			i++;
			aux=aux->sig;
			}else if(strcmpi(aux->dato.email,p.email)!=0){
			i++;
			aux=aux->sig;
			}else if(strcmpi(aux->dato.celular,p.celular)!=0){
			i++;
			aux=aux->sig;
			}else if(aux->dato.fecNac.anio!=p.fecNac.anio){
			i++;
			aux=aux->sig;
			}else if(aux->dato.fecNac.mes!=p.fecNac.mes){
			i++;
			aux=aux->sig;
			}else if(aux->dato.fecNac.dia!=p.fecNac.dia){
				i++;
				aux=aux->sig;
			}else{
				return -1;
			}
		}
	}
	return 0;
}


int insEnListaVacia (Lista *l,Amigo p){
	Persona *aux;
	if ((aux = (Persona *) malloc (sizeof (Persona))) == NULL){
        return -1;
	}
	aux->dato=p;
	aux->sig=NULL;
	l->inicio=aux;
	l->fin=aux;
	l->cantidad++;
} 


int insInicioLista (Lista *l,Amigo p){
	Persona *aux;
	if ((aux = (Persona *) malloc (sizeof (Persona))) == NULL){
        return -1;
	}
	aux->dato=p;
	aux->sig=l->inicio;
	l->inicio=aux;
	l->cantidad++;
}


void mostrarAmigo(Amigo p){
	printf("\nLos datos del amigo es: \n");
	printf("El apellido de su amigo: %s\n",p.apellido);
	printf("El nombre de su amigo: %s\n",p.nombre);
	printf("El email de su amigo: %s\n",p.email);
	printf("El celular de su amigo: %s\n",p.celular);
	printf("Fecha de cumpleaños de su amigo. %i/%i/%i\n",p.fecNac.dia,p.fecNac.mes,p.fecNac.anio);
}


void mostrarDatos(Lista *l){
	Persona *aux;
	int i=1;
	if ((aux = (Persona *) malloc (sizeof (Persona))) == NULL){
        return -1;
	}
	aux=l->inicio;
	while (i<=l->cantidad){
		mostrarAmigo(aux->dato);
		aux=aux->sig;
		i++;
	}
}


int ordenar(Lista *l){
	int pos=1;
	Amigo cam;
	if(l->cantidad==1){
		return 0;
	}else{
		Persona *aux,*aux2,*min;
		if ((aux = (Persona *) malloc (sizeof (Persona))) == NULL){
        	return -1;
		}
		if ((aux2 = (Persona *) malloc (sizeof (Persona))) == NULL){
        	return -1;
		}
		if ((min = (Persona *) malloc (sizeof (Persona))) == NULL){
        	return -1;
		}
		min=l->inicio;
		while(pos<l->cantidad){
			aux=min;
			aux2=min->sig;
			while(aux2!=NULL){
				if((strcmpi(aux->dato.apellido,aux2->dato.apellido))>0){	//se comparan apellidos
					aux=aux2;											//se compara el nombre 
				}else if(((strcmpi(aux->dato.apellido,aux2->dato.apellido))==0)&&((strcmpi(aux->dato.nombre,aux2->dato.nombre))>0)){ 
					aux=aux2;
				}
				aux2=aux2->sig;		
			}
			cam=min->dato;
			min->dato=aux->dato;
			aux->dato=cam;
			min=min->sig;
			pos++;
		}
		return 0;
	}
}


int guardarArchivo(FILE *f,Lista *l){
	Persona *aux;
	Amigo a;
	int i=1;
	if ((aux = (Persona *) malloc (sizeof (Persona))) == NULL){
        return -1;
	}
	aux=l->inicio;
	while(aux!=NULL){
		a=aux->dato;
		fwrite((Amigo *)&a,i*sizeof(Amigo),i,f);
        aux=aux->sig;
        i++;
    }
	return 0;
}


int mostrarArchivo(FILE *f){
	Amigo aux;
	int numReg = ftell(f)/sizeof(Amigo),i;
	for(i=0;i<numReg;i++){
		fseek (f, i, SEEK_SET);
		fread (&aux,sizeof(Amigo),1, f);
		mostrarAmigo(aux);
	}
}