• Viernes 15 de Noviembre de 2024, 06:46

Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Temas - Jackie2

Páginas: [1]
1
C/C++ / Listas Enlazadas
« en: Lunes 31 de Mayo de 2004, 22:31 »
HOLA:
he hexo una prac de una asociacion de vecinos. en principio no tengo errores, pero el visual c no me deja ejecutarlo, me pone errores si me podeis ayudar. aki el kodigo:




#include <stdio.h> // printf, scanf, fprintf, fscanf, fopen, fclose, gets, fflush.
#include <stdlib.h> // malloc, free, system.
#include <string.h>
#include <conio.h> // getch, getche, getchar.


//Declaración estructuras

typedef struct
{
   int dia,mes,año;
}fecha_nacimiento;

typedef struct nodo
{
   char nombre[20],apedido1[20],apedido2[20],tipo[10],actividades[70];
   int DNI, num_socio;
   fecha_nacimiento fecha;
   struct nodo *siguiente;
}socio;

//Declaración de constantes
#define datos "datos.txt"
#define max_list_pant 4


//Declaración de funciones
void abir_lista(socio *);
void cerrar_lista (socio *);

void mostrar_menu(int, socio *);
void altas(int, socio *);
void bajas(int, socio *);
void modificaciones(int, socio*);
void consultas(int, socio*);
void salir (socio *);

socio *crear_lista();


int existe_elemento(socio *, int );
int inserir_elemento(socio **, socio );
int eliminar_elemento (socio **, int );
socio leer_elemento (socio *, int );
int actualitzar_elemento (socio *, socio );
void consulta_por_apedido (socio *, socio );
int guardar_elementos (socio *);

void inicio(char info[50]);
void mensaje (char info[50], char mensaje[50]);
void barra ();


/////////////////////////////////////////////////////////////////////////////////////////////////
// Función que abre el arxivo i introduce los datos en la lista
void abre_lista (socio *primero) {
   socio *nuevo, *aux;
   FILE *fichero;
   fichero = fopen (datos, "r");
   while (!feof(fichero)) {
      nuevo = (socio*) malloc (sizeof(socio));
      fscanf (fichero, "%s %s %s %d %d %d %d %d %s %s\n", nuevo->nombre, nuevo->apedido1,
nuevo->apedido2, &nuevo->DNI, &nuevo->num_socio, &nuevo->fecha.dia, &nuevo->fecha.mes,
&nuevo->fecha.año, neuvo->tipo, nuevo->actividades);
      nuevo->siguiente = NULL;
      if (primero == NULL) {
         primero = nuevo;
         aux = primero;
      } else {
         aux->siguiente = nuevo;
         aux = aux->siguiente;
      }
   }
   fclose (fichero);
}

///////////////////////////////////////////////////////////////////////////////////////////////
// Función que guarda los datos de la lista al archivo i lo cierra
void cierra_lista (socio *primero) {
   socio *aux, *index;
   FILE *fichero;
   fichero = fopen (datos, "w");
   for (index = primero; index != NULL; aux = index, index = index->siguiente,
free(aux))
      fprintf (fichero, "%s %s %s %d %d %d %d %d %s\n", index->nombre,
index->apedido1, index->apedido2, index->DNI, index->num_socio, index->fecha.dia,
index->fecha.mes, index->fecha.año, index->tipo,index->actividades);
   fclose (fichero);
}

//////////////////////////////////////////////////////////////////////////////////////////////
// Función que muestra las opciones del programa
void mostrar_menu (int opcion, socio *primero) {
   if ((opcion<6) && (opcion>0))
      printf ("\t\t\t      Has vuelto al menu");
   else
      printf ("\t\t\t     Bienvenido al programa");
   printf ("\n\t\t Porfavor escoge una de las siguientes opciones\n\n");
   printf ("\t\t\t\t 1- Altas");
   printf ("\n\t\t\t\t 2- Bajas\n");
   printf ("\t\t\t\t 3- Modificaciones\n");
   printf ("\t\t\t\t 4- Consultas\n");
   printf ("\t\t\t\t 5- Salir\n");
   barra ();
   printf ("\n\t\t\t\t(1/2/3/4/5):\n\n \t\t\t\t");
   scanf ("%d", &opcion);
   switch (opcion) {
      case 1:
         altas (opcion, primero);
         break;
      case 2:
         baixes (opcion, primero);
         break;
      case 3:
         modificaciones (opcion, primero);
         break;
      case 4:
         consultas (opcion, primero);
         break;
      case 5:
         sortir (primero);
         break;
      default:
         mostrar_menu (opcion, primero);
         break;
   }
}

/////////////////////////////////////////////////////////////////////////////////////////////////
// Función que introduce un elemento a la lista
void altas (int opcion, socio *primero) {
   char seguro;
   socio vecino;
   inicio ("\t\t\t       Inserir nuevo socio");
   printf ("\n\t\t\tNombre: "); gets (vecino.nombre);
   printf ("\t\t\tPrimer apedido: "); gets (vecino.apedido1);
   printf ("\t\t\tSegundo apedido: "); gets (vecino.apedido2);
   printf ("\t\t\tDNI: "); scanf ("%d", &vecino.DNI);
   printf ("\t\t\tNumero de socio: "); scanf ("%d", &vecino.num_socio);
   printf ("\t\t\tDia nacimiento: "); scanf ("%d", &vecino.fecha.dia);
   printf ("\t\t\tMes nacimiento: "); scanf ("%d", &vecino.fecha.mes);
   printf ("\t\t\tAño nacimientot: "); scanf ("%d", &vecino.fecha.año);
   printf ("\t\t\tTipo socio:(escoja una de las siguientes opciones)\n ");
   printf ("\t\t\tInfantil(0-10años), Junior(11-17años)\n\t\t\tAdulto(18-65años) i Senior(+ de 65 añoss)\n\t\t\t");
   gets (vecino.tipo);
   printf ("\t\t\tEscoja hasta 5 actividades con las podria estar interessado:\n ");
   printf ("Juegos de rol, bailes de de salon, dominó, manualidades, billar, futbol, pintura, astronomia, danza del vientre i cocina xina\n ");
   gets (vecino.actividades);
   barra();
   printf ("\n\t\t      Esta seguro que quiere crear el socio?\n");
   do {
      inicio ("\t\t\t\t    (s/n): ");
         scanf ("%c", &seguro);
   } while ((seguro != 's') && (seguro != 'n'));
   if (seguro == 's') {
      if (existe_elemento (primero, vecino.DNI)) {          mensaje ("\t\t\t       Inserir nuevo socio", "\t\t\t\tDNI duplicado");
         altas (opcion, primero);
      } else {
         if (inserir_elemento (&primero, vecino)) {
            guardar_elementos (primero);
            mensaje ("\t\t\t       Inserir nuevo socio", "\t\t\t       Socio dado de alta");
            mostrar_menu (opcion, primero);
         } else {
            mensaje ("\t\t\t       Inserir nuevo socio", "\t\t\tNo se ha podido inserir el socio");
            altas (opcion, primero);
         }
      }
   } else mostrar_menu (opcion, primero);
}

// Función que inserta un elemento a la llista
int inserir_elemento (socio **primero, socio vecino) {
   socio *nuevovecino, *ant, *act;
   nuevovecino = (socio *) malloc (sizeof(socio));
   if (nuevovecino == NULL) {
      return 0;
   } else {
      *nuevovecino = vecino;
      if (*primero == NULL) {
         *primero = nuevovecino;
         nuevovecino->siguiente = NULL;
      } else if ((*primero)->DNI > vecino.DNI) {
         nuevovecino->siguiente = *primero;
         *primero = nuevovecino;
      } else {
         act = ant = *primero;
         while ((act->DNI < vecino.DNI) && (act->siguente != NULL)) {
            ant = act;
            act = act->siguiente;
         }
         if (act->DNI < vecino.DNI) ant = act;
         nuevovecino->ssiguente = ant->siguiente;
         ant->siguiente = nuevovecino;
      }
      return 1;
   }
}

// Función que guarda la lista al archivo
int guardar_elementos (socio *primero) {
   socio *index;
   FILE *fichero;
   if (fichero = fopen (datos, "w")) {
      for (index = primero; index != NULL; index = index->siguiente)
         fprintf (fichero, "%s %s %s %d %d %d %d %d %s\n", index->nombre,
index->apedido1, index->apedido2, index->DNI, index->num_socio, index->fecha.dia,
index->fecha.mes, index->fecha.año, index->tipo, index->actividades);
      return 1;
   } else return 0;
   fclose (fichero);
}

//////////////////////////////////////////////////////////////////////////////////////////////
// Función que elimina un elemento de la lista
void bajas (int op, socio *primero) {
   int DNI=0;
   char seguro='n';
   inicio ("\t\t\t\tEliminar socios");
   printf ("\n\t\t\t       Introduzca el DNI: ");
   scanf ("%d", &DNI);
   if (existe_elemento (primero, DNI)) {
      barra();
      printf ("\n\t\t     Esta seguro que quiere eliminar el socio?\n");
      do {
         printf ("\t\t\t\t    (s/n): ");
         scanf ("%c", &seguro);
      } while ((seguro != 's') && (seguro != 'n'));
      if (seguro == 's') {
         if (eliminar_elemento (&primero, DNI)) {
            guardar_elementos (primero);
            mensaje ("\t\t\t\tEliminar socios", "\t\t\t      Socio dado de baja");
            mostrar_menu (op, primero);
         } else {
            mensaje ("\t\t\t\tEliminar socios", "\t\t\tNo se ha podido elminar el socio");
            bajas (op, primero);
         }
      } else {
         mostrar_menu (op, primero);
      }
   } else {
      mensaje ("\t\t\t\tEliminar socios", "\t\t\t      El DNI no existe");
      bajas (op, primero);
   }
}

// Función que comprueba si el dni del elemento introducido existe
int existe_elemento (socio *primero, int DNI) {
   socio *aux;
   int encontrado;
   aux = primero;
   econtrado = 0;
   while ((aux != NULL) && (!encontrado)) {
      if (aux->DNI == DNI) encontrado = 1;
      else aux = aux->siguiente;
   }
   return encontrado;
}

// Función que elimina un elemento de la lista buscado por dni
int eliminar_elemento (socio **primero, int DNI) {
   socio *ant, *act;
   int encontrado;
   ant = NULL;
   act = *primero;
   encontrado = 0;
   while ((act != NULL) && (!encontrado)) {
      if (act->DNI == DNI)
         encontrado = 1;
      else {
         ant = act;
         act = act->siguiente;
      }
   }
   if (encontrado) {
      if (ant != NULL)
         ant->siguiente = act->siguiente;
      else *primero = act->siguiente;
      free (act);
      return 1;
   } else return 0;
}

//////////////////////////////////////////////////////////////////////////////////////////////

void modificaciones (int op, socio *primero) {
   socio vecino;
   int camp;
   inicio ("\t\t\t       Modificar un socio");
   printf("\n\t\t     Introduzca el DNI del vecino a modificar: ");
   scanf("%d",&vecino.DNI);
   if (existe_elemento(primero,vecino.DNI)){
      vecino = leer_elemento(primero,vecino.DNI);
      inicio ("\t\t\t       Modificar un socio");
      printf("\n\t\t\tCampo a modificar?\n");
      printf("\n\t\t\t1- Nom: %s",vecino.nombre);
      printf("\n\t\t\t2- Primer apedido: %s",vecino.apedido1);
      printf("\n\t\t\t3- Segon apedido: %s",vecino.apedido2);
      printf("\n\t\t\t4- Numero de socio: %d",vecino.num_socio);
      printf("\n\t\t\t5- Dia nacimiento: %d",vecino.fecha.dia);
      printf("\n\t\t\t6- Mes de nacimiento: %d",vecino.fecha.mes);
      printf("\n\t\t\t7- Año de nacimiento: %d",vecino.fecha.año);
      printf("\n\t\t\t8- Tipo de socio: %s",vecino.tipo);
      printf("\n\t\t\t9- Actividades: %s",vecino.actividades);
      printf("\n\t\t\t10- Salir");
      printf ("\n");
      barra();
      printf("\n\t\t\t(1/2/3/4/5/6/7/8/9): ");
      scanf("%d",&camp);
      switch (camp){
      case 1:
         printf("\nIntroduzca  otro nombre: ");
         scanf("%s",&vecino.nombre);
         break;
      case 2:
         printf("Introduzca otro 1r apedido: ");
         scanf("%s",&vecino.apedido1);
         break;
      case 3:
         printf("Introduzca otro 2n apedido: ");
         scanf("%s",&vecino.apedido2);
         break;
      case 4:
         printf("Introduca otro numero de socio: ");
         scanf("%d",&vecino.num_socio);
         break;
      case 5:
         printf("Introduzca otro dia de nacimiento: ");
         scanf("%d",&vecino.fecha.dia);
         break;
      case 6:
         printf("Introduzca otro mes de naixement: ");
         scanf("%d",&vecino.fecha.mes);
         break;
      case 7:
         printf("Introduzca otro año de nacimiento: ");
         scanf("%d",&vecino.fecha.año);
         break;
      case 8:
         printf("Introduzca otro tipo de socio : ");
         scanf("%",&vecino.tipo);
         break;
      case 9:
         printf("Introduzca otras actividades : ");
         scanf("%",&vecino.actividades);
         break;
      case 10:
         printf(" sino quieres realizar ninguna operacion volvemos al menu");
         break;
      default:
         modificaciones (op,primero);
         break;
      }
      if (actualitzar_elemento(primero,vecino)){
         guardar_elementos(primero);
         mensaje ("\t\t\t\tModificar socios", "\t\t\t      Socio modificado");
         mostrar_menu(op,primero);
      } else  {
         mensaje ("\t\t\t\tModificar socios", "\t\t\t      Socio no modificado");
         modificaciones (op,primero);
      }
   } else {
         mensaje ("\t\t\t\tModificar socios", "\t\t\t      El DNI no existe");
         modificaciones (op,primero);
   }
}

socio leer_elemento (socio *primero, int DNI) {
   socio *aux;
   aux=primero;
   while(aux->DNI!=DNI) {
      aux=aux->siguiente;
   }
   return (*aux);
}

int actualitzar_elemento (socio *primero, socio vecino) {
   socio *aux;
   aux=primero;
   while(aux->DNI!=vecino.DNI) {
      aux=aux->siguiente;
   }
    *aux = vecino;
   if (aux->DNI==vecino.DNI) return (1);
   else return(0);
}
//////////////////////////////////////////////////////////////////////////////////////////

void consultas (int op, socio *primero) {
   int consultas;
   socio vecino;
   printf("\n\t\t\tMenú de consultas");
   printf("\n\t\t\t1-Consulta por DNI");
   printf("\n\t\t\t2-Consulta por primer apedido");
   printf("\n\t\t\t3-Sortir\n\t\t\t");
   scanf("%d",&consulta);
   switch (consulta) {
   case 1:
      printf("\n\t\t\tIntroduzca el DNI: ");
      scanf("%d",&vecino.DNI);
      if (existe_elemento(primero,vecino.DNI)) {
         vecino = leer_elemento(primero,vecino.DNI);
         printf("\n\t\t\tNombre: %s",vecino.nombre);
         printf("\n\t\t\t1r Apedido: %s",vecino.apedido1);
         printf("\n\t\t\t2n Apedido: %s",vecino.apedido2);
         printf("\n\t\t\tNumero de socio: %d",vecino.num_socio);
         printf("\n\t\t\tDia de nacimiento: %d",vecino.fecha.dia);
         printf("\n\t\t\tMes de nacimiente: %d",vecino.fecha.mes);
         printf("\n\t\t\tAño de nacimiento: %d",vecino.fecha.año);
         printf("\n\t\t\tTipo de socio: %s",vecino.tipo);
         printf("\n\t\t\tActividades: %s",vecino.actividades);
      } else {
            mensaje ("\t\t\t\tModificar socios", "\t\t\t      El DNI no existe");
            consultas(op,primero);
      }
      break;
   case 2:
      printf("\n\t\t\tIntroduzca el Primer apedido: ");
      scanf("%s",&vecino.apedido1);
      consulta_por_apedido(primero, vecino);
      break;
   case 3:
      printf("\t\t\tSi noquiere realizar nignuna consulta volvamos al menu principal");
      break;
   default:
      consultas(op,primero);
      break;
   }
   getch();
   mostrar_menu(op,primero);
}

//funcion encargada de buscar  socios con el mismo apedido i mostralos
void consulta_por_apedido (socio *primero, socio vecino)
{
   socio *aux;
   int contador;
   aux=primero;
   contador=0;
   while(aux!=NULL)
   {
      if (strcmp(aux->apedido1,vecino.apedido1)==0)
      {
         printf("\n\t\t\tDNI: %d",aux->DNI);
         printf("\n\t\t\tNombre: %s %s %s",aux->nombre, aux->apedido1,aux->apedido2);
         printf("\n\t\t\tNumero de socio: %",aux->num_socio);
         printf("\n\t\t\tFecha  de nacimiento: %d/%d/%d",aux->fecha.dia,aux->fecha.mes,aux->fecha.año);
         printf("\n\t\t\tTipo de socio: %s",aux->tipo);
         contador=contador + 1;

         if (contador>=max_list_pant) {
            contador=0;
            printf("\n\t\tPulse una tecla para ver la siguiente pagina\n");
            getch();
         }
      }
      aux=aux->siguiente;
   }
}

////////////////////////////////////////////////////////////////////////////////////////////

// Función que inserta elementos a la llista i finaliza el programa
void salir (socio *primero) {
   cierra_lista (primero);
   inicio ("\t\t\t     Salir del programa");
   printf ("\n\t\t\t  ");
}

///////////////////////////////////////////////////////////////////////////////////////////////



// Función que muestra el inicio del entorno
void inicio(char info[50]) {
   system("cls");
   fflush(stdin);
   printf ("\n");
   barra();
   printf ("\t\t\t Programa Associacion de Vecinos");
   barra();
   printf ("%s", info);
   barra();
}

// Función que muestra un mensaje
void mensaje (char info[50], char mensaje[50]) {
   system ("cls");
   inicio (info);
   printf ("\n %s\n", mensaje);
   barra();
   printf ("\n\t\t\t Pulsa una tecla para continuar");
   getch();
   fflush(stdin);
}



// Función que dibuja las barras
void barra() {
   printf ("\n\t |--------------------------------------------------------|\n");
}

main ()
{
   socio *primero;
   primero = crea_lista ();
   abre_lista (primero);
   mostrar_menu (0, primero);
}


// Función que inicializa primero
socio *crea_lista() {
   socio *primero;
   primero = NULL;
   return primero;
}

Páginas: [1]