Underc0de

Programación General => C / C++ => Mensaje iniciado por: Olger346 en Junio 26, 2015, 12:23:05 PM

Título: Estructura de Datos [Cola Circular][C]
Publicado por: Olger346 en Junio 26, 2015, 12:23:05 PM
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.

#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);
}



Título: Re:Estructura de Datos [Cola Circular][C]
Publicado por: sitoftonic en Abril 06, 2017, 10:28:13 AM
Aquí te dejo una alternativa implementada con dos archivos, uno .h y otro .c

cola.h



#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



#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);
}