Nombre Password [ Regístrate ]

Biblioteca infantil (OIE 3 - 1999) - Código en C
/* 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 */
}



© (2001-2008) ALGORITMIA.NET - Política de privacidad