Estructura de Datos [Cola Circular][C]

Iniciado por Olger346, Junio 26, 2015, 12:23:05 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Junio 26, 2015, 12:23:05 PM Ultima modificación: Junio 28, 2015, 09:14:01 PM por rollth
Este es el primer tema que aporto a la comunidad. Espero que ayude a más de uno que se esta aventurando en estos temas. El programa tiene un pequeño error en la eliminación de los datos (cola circular) que no he podido arreglar, pero servirá como algoritmo base para cualquier pionero o perdido del tema.
Código: c

#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<stdlib.h>
/*PROYECTO#2
Grupo:11R-122 Universidad Tecnológica de Panamá
//Importante-----------------La cola funciona, hay que eliminar dos elementos y luego introducir, es un error que no hemos podido arreglar, pero por todo lo demas funciona bien
*/
// COLA
main(){

int cola[6]={NULL}, fr,fn, max, dato, opcion,x,eliminar,i,num,k;
int *frente,*puntero;
max=6;
//cola[0]=0;
fr=0;
fn=0;
i=0;

do{

system("color 1f");

system("cls");

printf("\n\t OPERACIONES QUE SE PUEDEN HACER EN UNA COLA \n\n\n");
printf("\n\t 1. Ingresar valores en la cola \n");
printf("\n\t 2. Mostrar datos que contiene la cola \n");
printf("\n\t 3. Eliminar valores de la cola \n");
printf("\n\t 4. Salir del programa \n");

scanf("%d",&opcion);

switch(opcion){
/*---------------------------------------------------*/
/*---------------------------------------------------*/
/* INSERTAR VALORES EN LA COLA */
case 1:{
system("cls");
    printf("\n\t Introduzca la cantidad de elementos de la Cola, max 5: ");
scanf("%d",&num);
// max=max+1; //quitar si se estropea
printf("\n\t La posicion %d esta reservada en la cola circular como frente \n",fr);


if(fr!=(fn+1)%max){


    //fn=(fn+1)%max;
    for(i=0; i<=num; i++){

    printf("\n\t %d final esta ",fn);
    if(fn==fr)
    {
      i=i+1;
    }
    fn=fn+1;

printf("\n\t Introduzca el dato %d de la cola:\n",fn);
scanf("%d",&dato);
cola[fn]=dato;


printf("\n fn =%d ",fn);
printf("\n fr =%d", fr);

     }
    }

    else
    printf("La cola esta llena");
    printf("\n final es %d ",fn);
     if(fn==max)
     {
         fn=0;
     }

}
getch();
break;


/*---------------------------------------------------*/
/*---------------------------------------------------*/
/* MOSTRAR VALORES DE LA COLA */
case 2:{

system("cls");

if(fr==fn)
{
printf("\n\t La cola esta vacia");
}
    else
{
printf("\n Datos de la cola: \n"); i=i+20;
    for(i=1; i<max; i++)
{

    printf("%d \n",cola[i]); //cambiar a fn si se estropea el programa
     }
}
    printf("\n Final=%d ",fn);
    printf("\n Frente=%d ",fr);
}
getch();
break;
/*---------------------------------------------------*/
/*---------------------------------------------------*/
/* ELIMINAR VALORES EN LA COLA */
case 3:{

system("cls");

if(fn==fr)
{
printf("\n\t Cola vacia");
}
else
{
    printf("\n\t Cuantos elementos desea eliminar: ");
    scanf("%d",&eliminar);
//fr=(fr(fr+1)%max);
for(x=0; x<eliminar; x++)
{
    frente=&cola[0];
    //cambiar a menos si se estropea el programa
frente[fr]=NULL; //quitar esto si se estropea el programa
fr++;
    frente[fr]=NULL;
frente=&cola[fr];
printf("\n\t El elemento de la posicion %d fue eliminado",fr);
/* if(fr>fr-1)
     {
         i=i-fn;
      //   fn=fn-1;
      //   puntero=&num;
       //  puntero=NULL;

    }*/


     }
getch();
}
}

break;

/*---------------------------------------------------*/
/*---------------------------------------------------*/
/* SALIR DEL PROGRAMA*/
case 4:{

printf("\n Saliendo del programa ");
return 0;
}
break;
}
}while(opcion<5);
}



"Cuando se nace pobre, estudiar es el mayor acto de rebeldía contra el sistema. El saber rompe las cadenas de la esclavitud" -Tomas Bulat.

Aquí te dejo una alternativa implementada con dos archivos, uno .h y otro .c

cola.h

Código: c


#include <stdio.h>
#define MAX 100

typedef int Elemento; //Cambiar int por cualquier otro tipo.

typedef struct{
Elemento info[MAX];
int q;
int cabeza;
} Cola;

typedef struct n{
  Element e;
  struct n *sig;
} Nodo;


Cola COLA_crea();
void COLA_anadir(Cola *c, Elemento e);
Elemento COLA_primero(Cola c);
void COLA_sacar(Cola *c);
int COLA_vacia(Cola c);
void COLA_destruye(Cola *c);




cola.c

Código: c


#include <stdio.h>
#include "cola.h"

//CREA LA COLA
Cola COLA_crea(){
  Cola c;

  c.cabeza = NULL;
  c.ult = NULL;
  return c;
}

//AÑADIR ELEMENTO A LA COLA
void COLA_anadir(Cola *c, Element e){
  Nodo *aux;

  aux=(Nodo*)malloc(sizeof(Nodo));
  if(aux == NULL){
    printf("Error en la peticio de memoria");
  }
  else{
    (*aux).e = e;
    (*aux).sig = NULL;
    if(((*c).cabeza || (*c).ult) == NULL){
      (*c).cabeza = aux;
    }
    else{
      (*(*c).ult).sig = aux;
    }
    (*c).ult = aux;
  }
}

//SACAR ELEMENTO A LA COLA
void COLA_sacar(Cola *c){
  Nodo *aux;

  if((*c).cabeza == NULL){
    printf("Cola buida!\n");
  }
  else{
    aux = (*c).cabeza;
    (*c).cabeza = (*aux).sig; //El contingut del punter que apunta al primer node de la cola passa a apuntar el sigüent node
    free(aux);
    if ((*c).cabeza == NULL){
      (*c).ult = NULL;
    }
  }
}

//COMPROBAR SI LA COLA ESTÁ VACÍA
int COLA_vacia(Cola c){
  return ((*c).cabeza) == NULL);
}

//DESTRUIR COLA
int COLA_destruye(Cola *c){
  Nodo *aux;

  while(*c) != NULL){
    aux = *c;
    *c = (*aux).sig;
  }
  free(aux);
  free(*p);
}