• Viernes 15 de Noviembre de 2024, 09:45

Autor Tema:  Listas Enlazadas  (Leído 947 veces)

Jackie2

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Listas Enlazadas
« en: Lunes 31 de Mayo de 2004, 22:31 »
0
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;
}

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Listas Enlazadas
« Respuesta #1 en: Martes 1 de Junio de 2004, 20:30 »
0
deberias decir cuales errores o warnings..
porque en un principio no creo que m,uchos se pongan a leer ese codigo, y menos si loo has colocado sin identar.
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

The Black Boy

  • Miembro de PLATA
  • *****
  • Mensajes: 1043
  • Nacionalidad: co
    • Ver Perfil
    • http://www.mslatam.com/latam/technet/mva2/Microsite.aspx?alias=JairoDiaz
Re: Listas Enlazadas
« Respuesta #2 en: Martes 1 de Junio de 2004, 20:37 »
0
totalmente de acuerdo con tigo Juank... es muy complicado proporcionar ayuda si no dices cual es el error especifico

Saludos :hola:
El inteligente no es aquel que lo sabe todo
sino aquel que   sabe utilizar lo poco que sabe.


Espacio Personal

si necesitas algo de programacion click aqui, si no esta aqui no existe

Programacion]

Jackie2

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Re: Listas Enlazadas
« Respuesta #3 en: Miércoles 2 de Junio de 2004, 00:05 »
0
Ya he solucionado la practika.
Nada cosas de memoria...

Saludos.