21/07/2016, 15:18
|
| | Fecha de Ingreso: abril-2016 Ubicación: Cordoba
Mensajes: 22
Antigüedad: 8 años, 7 meses Puntos: 1 | |
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);
}
}
|