01/06/2006, 05:57
|
| | Fecha de Ingreso: abril-2005
Mensajes: 8
Antigüedad: 19 años, 8 meses Puntos: 0 | |
Gracias, a todos por la ayuda, al final lo he cambiado un poco me lié con los tipos supongo. Os dejo mi ejercicio final. Con todo lo que había que hacer. Una cosa este es una lista simple que tiene puntero a cabeza. No como antes que sólo había puntero a cabeza.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NUM_CONTROLES 9
struct Registro
{
int dorsal;
int num_control;
float tiempo_paso;
};
typedef struct Registro TipoRegistro;
struct Nodo
{
int dorsal;
float tiempos[NUM_CONTROLES];
struct Nodo *sig;
};
typedef struct Nodo TipoNodo;
struct Lista
{
struct Nodo *primero;
struct Nodo *ultimo;
int num;
};
typedef struct Lista TipoLista;
//prototipos
void LeerFichero(TipoLista *l);
void IniciarLista(TipoLista *l);
void Mostrar(TipoLista *l);
void MostrarLosCorredoresMeta(TipoLista *l);
void MostrarTramoMenorMeta(TipoLista *l);
void MostrarMenu(void);
void BorrarLista( TipoLista *l);
int main( void )
{
int opcion;
TipoLista lista;
IniciarLista( &lista );
LeerFichero( &lista );
while(opcion!=4)
{
MostrarMenu();
printf("Dime la opcion:\n");
scanf("%d",&opcion);
switch(opcion)
{
case 1: Mostrar(&lista);
break;
case 2:
MostrarLosCorredoresMeta(&lista);
break;
case 3:
MostrarTramoMenorMeta(&lista);
break;
case 4:
puts("Gracias por usar el programa");
BorrarLista( &lista );
break;
default:
puts("Te has equivocado, escoge una opcion del 1 al 4");
break;
}
}
return 0;
}
void LeerFichero(TipoLista *l)
{
FILE *fp;
TipoRegistro unCorredor;
TipoNodo *aux,*nuevo;
int encontrado;
int i;
fp = fopen("marato_i_mitja.dat","rb");
if (fp == NULL) {
printf("ERROR: El fichero no se ha podido abrir\n");
exit(1);
}
fread(&unCorredor, sizeof(TipoRegistro),1,fp);
while( !feof(fp) )
{
// printf( "Dorsal del corredor: %d\n", unCorredor.dorsal );
//Vamos a ver si el corredor está ya en la lista:
encontrado = 0;
aux = l->primero;
while( aux != NULL && !encontrado )
{
if( aux->dorsal == unCorredor.dorsal )
{
aux->tiempos[unCorredor.num_control-1] = unCorredor.tiempo_paso;
encontrado = 1; //SI QUE ESTA
}
aux = aux -> sig;
}
if( !encontrado ) //NO ESTA
{
//crear un nuevo nodo e insertarlo
nuevo = malloc( sizeof(TipoNodo) );
for (i=0; i<NUM_CONTROLES; i++)
nuevo->tiempos[i] = -1;
nuevo->dorsal = unCorredor.dorsal;
nuevo->tiempos[unCorredor.num_control-1] = unCorredor.tiempo_paso;
nuevo->sig = NULL;
if( l->ultimo!=NULL )
{
l->ultimo->sig = nuevo;
l->ultimo = nuevo;
}
else
{
l->primero = nuevo;
l->ultimo = nuevo;
}
l->num++;
}
fread(&unCorredor, sizeof(TipoRegistro),1,fp);
}//fin while
fclose(fp);
}//leerfichero
void IniciarLista(TipoLista *l)
{
l->primero = NULL;
l->ultimo = NULL;
l->num = 0;
}
void Mostrar(TipoLista *l)
{
int i;
TipoNodo *aux;
aux = l->primero;
while( aux!=NULL )
{
printf("%4d: ", aux->dorsal);
for(i=0; i<NUM_CONTROLES; i++)
{
printf("%5.2f ",aux->tiempos[i]);
}
printf("\n");
aux = aux->sig;
}
}
void MostrarLosCorredoresMeta(TipoLista *l)
{
TipoNodo *aux;
aux= l->primero;
int cantidad=0;
while( aux != NULL )
{
if(aux->tiempos[NUM_CONTROLES-1] != -1)
{
printf("%d\n", aux->dorsal);
cantidad++;
}
aux = aux->sig;
}
printf("\nEl total de corredores que han alcanzado la meta es ---> %d\n", cantidad);
}
void MostrarTramoMenorMeta(TipoLista *l)
{
TipoNodo *aux;
aux=l->primero;
//float menor;
int tramo,mejor;
int menortiempo;
int i;
int dorsalrapido;
while( aux!=NULL )
{
if(aux->tiempos[NUM_CONTROLES-1]!=-1)
{
dorsalrapido=aux->dorsal;
for(i=0;i<NUM_CONTROLES-1;i++)
{
tramo = aux->tiempos[i+1] - aux->tiempos[i];
if(tramo>menortiempo)
{
menortiempo = tramo;
mejor = i;
dorsalrapido = aux->dorsal;
}
printf("El corredor es %d\n",dorsalrapido);
printf("\nEl tramo recorrido en menos tiempo es %d", mejor);
}
}
aux = aux->sig;
}
printf("El corredor más rápido es %d\n",dorsalrapido);
printf("\nEl tramo recorrido en menos tiempo es %d", mejor);
}
void MostrarMenu(void)
{
printf("\n");
printf("---------------------------------------MENU----------------------------");
printf("\n1-Mostrar el contenido de la lista ");
printf("\n2-Mostrar la cantidad de corredores \nque han llegado a la meta ");
printf("\n3-Mostrar El menor tiempo de los corredores que han llegado a la meta");
printf("\n4-Salir");
printf("-----------------------------------------------------------------------\n");
}
void BorrarLista( TipoLista *l)
{
TipoNodo *aux;
if(l->primero == l->ultimo)
{
free(l->primero);
l->primero = NULL;
l->ultimo = NULL;
}
else
{
for(aux=l->primero;aux->sig!=l->ultimo;aux=aux->sig);
aux->sig = NULL;
free(l->ultimo);
l->ultimo = aux;
}
} |