jueves, 14 de julio de 2011

ANSI C extra: implementación de una cola circular

En el post ANSI C tarea: Pilas y Colas se mencionó la existencia de una estructura llamada Pila Circular. En esta ocasión quiero presentar un ejemplo de la implementación de la Cola Circular Estática.

Que sea estática significa que toma como base un arreglo, por lo que el número de elementos que contiene y la memoria que utiliza, están limitados por el tamaño del arreglo con el que se construye.

Para este ejemplo, construí una cola de 10 elementos, pero puede extenderse para que se utilice con cualquier número de elementos.

El código para la Cola Circular Estática es el siguiente:

#include 
#include 
#include "bool.h"

bool estaVacia(int* arreglo){
  
  int i;
  for(i=0; i < 10; i++ ){
    if(arreglo[i] > -1){
      return FALSE;
      break;
    }
  }
  return TRUE;
}

void insertar(int n, int**a, int* fr, int* fn){
  printf("%d, %d\n", *fr, *fn);
  int* esteArreglo = *a;
  if(estaVacia(esteArreglo)){
    *fr = *fn = 0;
  }
  else if(*fn == 9){
    (*fn) = 0;
  }
  else{
    (*fn)++;
  }
  esteArreglo[*fn] = n;
}

int remover(int**a, int*fr, int*fn){
  printf("%d, %d\n", *fr, *fn);
  int* esteArreglo = *a;
  int x = esteArreglo[*fr];
  if((*fr) == (*fn)){
    (*fr) = (*fn) = -1;
  }
  else if((*fr) == 9){
    (*fr) = 0;
  }
  else{
    (*fr)++;
  }
  return x;
}

void imprimir(int* arreglo, int principio){
  
  int i;
  for(i = principio; i < 10; i++){
    printf("%d ", arreglo[i]);
  }
  printf("\n");
}

int main(){
  //indices para controlar el final y el principio de la cola
  int frente = -1;
  int fin = -1;
  //arreglo que contendra los elementos de la cola (10 elementos)
  int* arreglo = NULL;
  arreglo = (int*)malloc(sizeof(int)*10);

  if(arreglo == NULL){
    printf("No se pudo reservar memoria para el arreglo\n");
  }
  else{
    int index;
    for(index = 0; index < 10; index ++){
      arreglo[index] = -1;
    }  
  }

  insertar(2, &arreglo, &frente, &fin);
  imprimir(arreglo, frente);

  insertar(4, &arreglo, &frente, &fin);
  imprimir(arreglo, frente);

  insertar(3, &arreglo, &frente, &fin);
  imprimir(arreglo, frente);

  insertar(10, &arreglo, &frente, &fin);

  imprimir(arreglo, frente);

  remover(&arreglo, &frente, &fin);
  imprimir(arreglo, frente);

  remover(&arreglo, &frente, &fin);

  imprimir(arreglo, frente);
  free(arreglo);
}

La salida de este ejemplo es la siguiente:

1 comentario: