TDA Bicola estática

TDA Bicola estática

Recuperando las prácticas de estucturas de datos en C que realicé durante mis tiempos de estudiante en la Escuela Politécnica de Jaén, quiero dejaros hoy el código fuente de una bicola estática en c.

Para los que quieran utilizarla en sus propios desarrollos, os dejo en enlace a mi cuenta de github en la que podéis descargarla.

Comenzamos con el fichero .h en el que están declaradas todas las cabeceras de las funciones y procedimientos que proporcionarán la funcionalidad a ésta estructura de datos.

#ifndef BCE_int_H
#define BCE_int_H

#define MAXPint 9   //Tamanio maximo del array

struct bce_int_typo {   //Tipo base de la pila
  int info;
};


typedef struct bce_int_rep *bce_int;

bce_int bce_int_nuev(void);
int bce_int_vacia(bce_int bce);
int bce_int_llena(bce_int bce);
void bce_int_metei(bce_int bce,struct bce_int_typo *e);
void bce_int_meted(bce_int bce,struct bce_int_typo *e);
void bce_int_sacai(bce_int bce,struct bce_int_typo *e);
void bce_int_sacad(bce_int bce,struct bce_int_typo *e);
void bce_int_mirai(bce_int bce,struct bce_int_typo *e);
void bce_int_mirad(bce_int bce,struct bce_int_typo *e);
bce_int bce_int_copia1(bce_int origen);
bce_int bce_int_copia2(bce_int origen);
void bce_int_imprime(bce_int bce);
bce_int bce_int_dest(bce_int *bce);

#endif

En el siguiente fichero, os dejo el desarrollo de todas las funciones y procedimientos que declaré anteriormente.

#include <stdio.h>
#include <stdlib.h>
#include "BCE_INT.H"

struct bce_int_rep {
  struct bce_int_typo arr[MAXPint];
  int izq;
  int usados;
};

//---------------------------- PRIMITIVAS PUBLICAS --------------------

bce_int bce_int_nuev(void) {

  bce_int bce;

  bce=(struct bce_int_rep *) malloc (sizeof (struct bce_int_rep));
  if (!bce) {
     fprintf(stderr,"bce_int_nuev : no hay memoria.\n");
     exit(1);
  }
  bce->izq=bce->usados=0;
  return(bce);

}

//-------------------------------------------------------------------

int bce_int_vacia(bce_int bce) {

  if (!bce) {
     fprintf(stderr,"bce_int_vacia : la bicola no existe.\n");
     exit(2);
  }
  return(bce->usados==0);

}

//-------------------------------------------------------------------

int bce_int_llena(bce_int bce) {

  if (!bce) {
     fprintf(stderr,"bce_int_llena : la bicola no existe.\n");
     exit(2);
  }
  return(bce->usados==MAXPint);

}

//-------------------------------------------------------------------

void bce_int_metei(bce_int bce,struct bce_int_typo *e) {

  if (!bce) {
     fprintf(stderr,"bce_int_metei : la bicola no existe.\n");
     exit(2);
  }
  if (bce->usados==MAXPint) { //Si la bicola esta llena
     printf("c_int_metei : la bicola esta llena.\n");
     exit(3);
  }
  if ((bce->izq-1)<0) //Reajusta extremo izq
     bce->izq=MAXPint-1;
  else
     bce->izq--;
  bce->arr[bce->izq]=*e; //Meto dato
  bce->usados++;

}

//-------------------------------------------------------------------

void bce_int_meted(bce_int bce,struct bce_int_typo *e) {

  if (!bce) {
     fprintf(stderr,"bce_int_meted : la bicola no existe.\n");
     exit(2);
  }
  if (bce->usados==MAXPint) { //Si la bicola esta llena
     printf("c_int_meted : la bicola esta llena.\n");
     exit(3);
  }
  bce->arr[(bce->izq + bce->usados)%MAXPint]=*e; //Meto dato
  bce->usados++;

}

//-------------------------------------------------------------------

void bce_int_sacai(bce_int bce,struct bce_int_typo *e) {

  if (!bce) {
     fprintf(stderr,"bce_int_sacai : la bicola no existe.\n");
     exit(2);
  }
  if (bce->usados==0) { //Si la bicola esta vacia
     printf("c_int_sacai : la bicola esta vacia.\n");
     exit(4);
  }
  *e=bce->arr[bce->izq]; //Devuelve el valor en 'e'
  bce->izq=(1+bce->izq)%MAXPint; //incrementa extr. izq
  bce->usados--;

}

//-------------------------------------------------------------------

void bce_int_sacad(bce_int bce,struct bce_int_typo *e) {

  if (!bce) {
     fprintf(stderr,"bce_int_sacad : la bicola no existe.\n");
     exit(2);
  }
  if (bce->usados==0) { //Si la bicola esta vacia
     printf("c_int_sacad : la bicola esta vacia.\n");
     exit(4);
  }
  *e=bce->arr[((bce->izq + bce->usados)-1)%MAXPint];//Devuelce el valor en 'e'
  bce->usados--;

}

//-------------------------------------------------------------------

void bce_int_mirai(bce_int bce,struct bce_int_typo *e) {

  if (!bce) {
     fprintf(stderr,"bce_int_mirai : la bicola no existe.\n");
     exit(2);
  }
  if (bce->usados==0) { //Si la bicola esta vacia
     printf("c_int_mirai : la bicola esta vacia.\n");
     exit(4);
  }
  *e=bce->arr[bce->izq]; //Devuelve el valor en 'e'

}

//-------------------------------------------------------------------

void bce_int_mirad(bce_int bce,struct bce_int_typo *e) {

  if (!bce) {
     fprintf(stderr,"bce_int_mirad : la bicola no existe.\n");
     exit(2);
  }
  if (bce->usados==0) { //Si la bicola esta vacia
     printf("c_int_mirad : la bicola esta vacia.\n");
     exit(4);
  }
  *e=bce->arr[((bce->izq + bce->usados)-1)%MAXPint];//Devuelce el valor en 'e'

}

//-------------------------------------------------------------------

//El nuevo objeto apunta al original
bce_int bce_int_copia1(bce_int origen) {

  bce_int destino;

  if (!origen) {
     fprintf(stderr,"bce_int_copia1 : la bicola no existe.\n");
     exit(2);
  }
  return(destino=origen);

}

//-------------------------------------------------------------------

//El nuevo objeto es un copia del original
bce_int bce_int_copia2(bce_int origen) {

  bce_int destino;

  if (!origen) {
     fprintf(stderr,"bce_int_copia2 : la bicola no existe.\n");
     exit(2);
  }
  destino=(struct bce_int_rep *) malloc (sizeof (struct bce_int_rep));
  if (!destino) {
     fprintf(stderr,"bce_int_copia2 : no hay memoria.\n");
     exit(1);
  }
  destino->izq=origen->izq;
  destino->usados=origen->usados;
  memcpy(destino->arr,origen->arr,sizeof(struct bce_int_typo)*MAXPint);
//  for (i=;i < origien->usados;i++) {
//     if ()

//  }
  return(destino);

}

//-------------------------------------------------------------------

void bce_int_imprime(bce_int bce) {

  int i;

  if (!bce) {
     fprintf(stderr,"bce_int_imprime : la bicola no existe.\n");
     exit(2);
  }
  printf("\nCONTENIDO DE LA BICOLA:");
  printf("\n=======================");
  for (i=0;i<bce->usados;i++)
     printf("\n%d",bce->arr[(bce->izq+i)%MAXPint]);

}

//-------------------------------------------------------------------

bce_int bce_int_dest(bce_int *bce) {

  if (!bce) {
     fprintf(stderr,"bce_int_dest : la bicola no existe.\n");
     exit(2);
  }
  free(*bce);
  *bce=NULL;

}

Por último, os dejo un pequeño programita de prueba para que se puedan verificar que todas las funciones y procedimientos de verdad funcionan.

#include <stdio.h>
#include <conio.h>
#include "BCE_INT.H"

int main (void) {

  bce_int a,b,c;
  struct bce_int_typo e;
  int i=1;

  clrscr();
  printf("comienzo...\n");
  a=bce_int_nuev(); //crea nueva bicola
  printf("bicola a creada...\n");
//  if (bce_int_vacia(a)) printf("La bicola esta vacia\n");
//  else printf("La bicola no esta vacia\n");

  e.info=i;
  bce_int_meted(a,&amp;e);  //meted(a,1)
  bce_int_mirai(a,&amp;e); //mirai(a,&amp;e)
  printf("MIRAI = %d\n",e.info);
  bce_int_mirad(a,&amp;e); //mirad(a,&amp;e)
  printf("MIRAD = %d\n",e.info);

  i++;
  e.info=i;
  bce_int_metei(a,&amp;e);  //metei(a,2)

  bce_int_mirai(a,&amp;e);
  printf("MIRAI = %d\n",e.info);
  bce_int_mirad(a,&amp;e);
  printf("MIRAD = %d\n",e.info);

  i++;
  e.info=i;
  bce_int_metei(a,&amp;e); //metei(a,3)

  bce_int_mirai(a,&amp;e);
  printf("MIRAI = %d\n",e.info);
  bce_int_mirad(a,&amp;e);
  printf("MIRAD = %d\n",e.info);

  bce_int_sacai(a,&amp;e); //sacai(a,3)
  printf("Se ha sacado por la izq: %d\n",e.info);
  bce_int_mirai(a,&amp;e);
  printf("MIRAI = %d\n",e.info);
  bce_int_mirad(a,&amp;e);
  printf("MIRAD = %d\n",e.info);

  i++;
  e.info=i;
  bce_int_meted(a,&amp;e); //meted(a,4)

  bce_int_mirai(a,&amp;e);
  printf("MIRAI = %d\n",e.info);
  bce_int_mirad(a,&amp;e);
  printf("MIRAD = %d\n",e.info);

  bce_int_sacad(a,&amp;e); //sacai(a,2)
  printf("Se ha sacado por la izq: %d\n",e.info);
  bce_int_mirai(a,&amp;e);
  printf("MIRAI = %d\n",e.info);
  bce_int_mirad(a,&amp;e);
  printf("MIRAD = %d\n",e.info);

  i++;
  e.info=i;
  bce_int_meted(a,&amp;e);  //meted(a,5)

  bce_int_mirai(a,&amp;e);
  printf("MIRAI = %d\n",e.info);
  bce_int_mirad(a,&amp;e);
  printf("MIRAD = %d\n",e.info);

  i++;
  e.info=i;
  bce_int_meted(a,&amp;e);  //meted(a,6)

  bce_int_mirai(a,&amp;e);
  printf("MIRAI = %d\n",e.info);
  bce_int_mirad(a,&amp;e);
  printf("MIRAD = %d\n",e.info);

  printf("\nPulsa una tecla...\n");
  getch();
  clrscr();

  b=bce_int_copia2(a);
  e.info=7;
  bce_int_metei(b,&amp;e);
  printf("\nContenido bicola por copia2");
  bce_int_imprime(b);
  printf("\nContenido bicola origen");
  bce_int_imprime(a);

  printf("\nPulsa una tecla...\n");
  getch();
  clrscr();

  c=bce_int_copia1(a);
  e.info=8;
  bce_int_metei(c,&amp;e);
  printf("\nContenido bicola por copia1");
  bce_int_imprime(c);
  printf("\nContenido bicola origen");
  bce_int_imprime(a);

  bce_int_dest(&amp;a);
  bce_int_dest(&amp;b);
  printf("\ndestruida bicola");
  printf("\nfin prueba. Pulsa una tecla...\n");
  getch();

}

Os invito a comentar y dejar vuestras opiniones sobre éste código y las alternativas que podáis sugerir.

No Comments

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.