Ir ao conteúdo
  • Cadastre-se
Danie1 Net0

C Minha implementação de fila estática sequencial circular não funciona

Recommended Posts

Estou implementando um algoritmo de fila estática sequencial circular, que não funciona como o esperado. Segue o código:

 

Arquivo 'filaestatica2.h'

#ifndef FILAESTATICA2_H
#define FILAESTATICA2_H

	#define SIM 1
	#define NAO 0
	#define SUCESSO 0
	#define MAX_ELEM 10
	#define FILA_VAZIA -1
	#define FILA_CHEIA 1
	#define ELEM_NULO 0

	struct Fila{
		int inicio;
		int fim;
		char elem[MAX_ELEM];
	}typedef Fila;

	int vazia(Fila);
	int cheia(Fila);
	void iniciarFila(Fila*);
	char obterInicio(Fila);
	void listarElementos(Fila);
	int inserir(Fila*, char);
	char remover(Fila*);
	int tamanho(Fila);

#endif

 

Arquivo 'filaestatica2.c'

#include <stdio.h>

#include "filaestatica2.h"

int vazia(Fila fila){
	if(fila.inicio == FILA_VAZIA){
		return SIM;
	}
	
	return NAO;
}

int cheia(Fila fila){
	if((fila.inicio == 0 && fila.fim == MAX_ELEM - 1) || (fila.inicio == fila.fim + 1)){
		return SIM;
	}
	
	return NAO;
}

void iniciarFila(Fila *fila){
	for(int i = 0; i < MAX_ELEM; i++){
		fila->elem[i] = 0;
	}
	
	fila->inicio = FILA_VAZIA;
	fila->fim = FILA_VAZIA;
}

char obterInicio(Fila fila){
	if(!vazia(fila)){
		return fila.elem[fila.inicio];
	}
	
	return ELEM_NULO;
}

void listarElementos(Fila fila){
	if(vazia(fila)){
		printf("\nFila Vazia!!\n");
	}else{
		printf("\n------------------Conteúdo da Fila------------------\n");
		
		int ordem = 1;
		
		for(int i = fila.inicio; i != fila.fim; i = ((i + 1) % MAX_ELEM)){
			printf("%i = %c\n", ordem, fila.elem[i]);
			ordem++;
		}
		
		printf("----------------------------------------------------\n");
	}
}

int inserir(Fila *fila, char dado){
	if(cheia(*fila)){
		fila->fim = (fila->fim + 1) % MAX_ELEM;
		fila->elem[fila->fim] = dado;
	}else{
		return FILA_CHEIA;
	}
	
	return SUCESSO;
}

char remover(Fila *fila){
	char e = ELEM_NULO;
	
	if(!vazia(*fila)){
		e = obterInicio(*fila);
		
		fila->elem[fila->inicio] = ELEM_NULO;
		
		if(fila->inicio == fila->fim){
			fila->inicio = FILA_VAZIA;
			fila->fim = FILA_VAZIA;
		}else{
			fila->inicio = (fila->inicio + 1) % MAX_ELEM;
		}
	}
	
	return e;
}

int tamanho(Fila fila){
	if(fila.inicio <= fila.fim){
		return fila.fim - fila.inicio + 1;
	}
	
	return ((MAX_ELEM - fila.inicio) + (fila.fim + 1));
}

 

Arquivo 'main.c'

#include <stdio.h>

#include "filaestatica2.h"

int main(){
	Fila fila;
	
	iniciarFila(&fila);
	
	listarElementos(fila);
	
	vazia(fila) ? printf("\nA fila está vazia\n") : printf("\nA fila não está vazia\n");
	cheia(fila) ? printf("\nA fila está cheia\n") : printf("\nA fila não está cheia\n");
	
	inserir(&fila, 'A');
	inserir(&fila, 'B');
	inserir(&fila, 'C');
	inserir(&fila, 'D');
	inserir(&fila, 'E');
	inserir(&fila, 'F');
	inserir(&fila, 'G');
	inserir(&fila, 'H');
	inserir(&fila, 'I');
	
	listarElementos(fila);
	
	vazia(fila) ? printf("\nA fila está vazia\n") : printf("\nA fila não está vazia\n");
	cheia(fila) ? printf("\nA fila está cheia\n") : printf("\nA fila não está cheia\n");
	
	inserir(&fila, 'J');
	
	listarElementos(fila);
	
	vazia(fila) ? printf("\nA fila está vazia\n") : printf("\nA fila não está vazia\n");
	cheia(fila) ? printf("\nA fila está cheia\n") : printf("\nA fila não está cheia\n");
	
	printf("\nPrimeiro elemento: %c\n", obterInicio(fila));
	
	remover(&fila);
	
	listarElementos(fila);
	
	printf("\nPrimeiro elemento: %c\n", obterInicio(fila));
	
	while(!vazia(fila)){
		remover(&fila);
	}
	
	listarElementos(fila);
	
	vazia(fila) ? printf("\nA fila está vazia\n") : printf("\nA fila não está vazia\n");
	cheia(fila) ? printf("\nA fila está cheia\n") : printf("\nA fila não está cheia\n");
		
	return 0;
}

 

O resultado é apenas esse:

Citação

Fila Vazia!!

A fila está vazia

A fila não está cheia

Fila Vazia!!

A fila está vazia

A fila não está cheia

Fila Vazia!!

A fila está vazia

A fila não está cheia

Primeiro elemento: 

Fila Vazia!!

Primeiro elemento: 

Fila Vazia!!

A fila está vazia

A fila não está cheia

 

Onde estará o erro? Me ajudem, por favor, já estou a vários dias tentando identificar a falha, porém sem nenhum sucesso.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×