/* Biblioteca infantil.
Primera fase OIE 1999
Compilado con DJGPP
*/
#include <stdio.h>
#include <stdlib.h>
#define ENTRADA "BIBL.DAT"
#define SALIDA "BIBL.OUT"
struct listade {
int n;
struct listade *izq,
*der;
};
typedef struct listade listade;
void procesar(int N, int k, int m, FILE *salida);
int main(void)
{
int N, k, m;
FILE *entrada, *salida;
entrada = fopen(ENTRADA, "r");
salida = fopen(SALIDA, "w");
if (entrada == NULL || salida == NULL) {
printf("\nError en los ficheros");
exit(1);
}
while (fscanf(entrada, "%d %d %d\n", &N, &k, &m) && N > 0)
procesar(N, k, m, salida);
fclose(entrada);
fclose(salida);
return 0;
}
void procesar(int N, int k, int m, FILE *salida)
{
listade *hor, *ant; /* sentido horario y antihorario */
listade *aux; /* para creacion y mantenimiento de la lista de ni¤os */
int i, a, b;
/* crea la lista */
hor = aux = (listade *) malloc(sizeof(listade));
aux->n = 1;
for (i = 2; i <= N; i++) {
aux->der = (listade *) malloc(sizeof(listade));
aux->der->n = i;
aux->der->izq = aux;
aux = aux->der;
}
/* establece la lista como circular */
ant = aux;
ant->der = hor;
hor->izq = ant;
/* saca los ni¤os y escribe el resultado en el fichero */
i = N;
while (i > 0) {
/* cuenta horaria */
for (a = k-1; a > 0; a--)
hor = hor->der;
/* cuenta antihoraria */
for (b = m-1; b > 0; b--)
ant = ant->izq;
/* escribe el resultado */
fprintf(salida, "%3d", hor->n);
i--;
if (ant->n != hor->n) {
fprintf(salida, "%3d", ant->n);
i--;
}
if (i > 0) fprintf(salida, ",");
/* libera memoria */
if (ant != hor) {
aux = ant;
aux->der->izq = aux->izq;
aux->izq->der = aux->der;
ant = ant->izq;
free(aux);
}
aux = hor;
aux->der->izq = aux->izq;
aux->izq->der = aux->der;
/* en el supuesto de que ant apunte a hor, hay que evitarlo */
if (ant == hor) ant = ant->izq;
hor = hor->der;
free(aux);
}
fprintf(salida, "\n"); /* imprime el salto de linea obligatorio */
}
|