Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

gRoOvE

[Resolvido] Dificuldade Fila Circular...

Recommended Posts

Estou quebrando a cabeça há algum tempo com esse algoritmo e não consigo resolver, na verdade a inserção e remoção da fila acredito estar certo, o problema é que não consigo exibir os dados, se alguém puder dar uma ajuda e me dizer onde estou errando. Obs: não quero usar o método da fila circular usando o %, como esse aqui.

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX 5

void inserir(char *s); //Inclui um evento da fila
void remover(); //Recupera um evento da fila

char *p[MAX];
int spos = 0;
int rpos = 0;

int main()
{
	int i;
	inserir("comer");
	inserir("durmir");
	inserir("jogar");
	remover();
	remover();
	remover();

	
	for(i=rpos; i<=spos; i++)
	{
		printf("%d - %s\n",i,p[i]);
	}

	system("pause");
	return(0);
}


void inserir(char *s)
{
	
	if( (spos+1 == rpos) || ( (spos == MAX) && (!rpos) ))
	{
		printf("Lista Cheia!"); return;
	}
	if(spos == MAX) spos = 0;
	p[spos] = s;
	spos++;
}

void remover()
{
	if(rpos == MAX) rpos = 0;
	if(spos == rpos)
	{
		printf("\nNao Existem Eventos!"); return;
	}
	rpos++;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

eu utilizaria um strcpy!

 

//dessa forma você tem certeza que está copiando o conteúdo de s em p[spos]
strcpy(p[spos], s);

//se você fizer: p[spos] = s, você estará copiando o endereço de memória, afinal, p[spos] e s são ponteiros para endereços de memória....
//execute esse código e veja só que coisa estranha!

int *x, y;

	y = 2341;
	x = &y;

	*x = 10;

	printf("x = %d\n", (*x));
	printf("y = %d\n", y);


o output será:
x = 10
y = 10

mas ali em cima nós setamos o y como 2341
mas copiamos o endereço de memória para x, e alteramos o valor dele, como era o mesmo que y, alteramos o valor de y também....

Compartilhar este post


Link para o post
Compartilhar em outros sites

eu utilizaria um strcpy!

 

//dessa forma você tem certeza que está copiando o conteúdo de s em p[spos]

Absoluta, cara estou apenas copiando o endereço da variável s para p[pos], ou seja, estou dizendo ao p[pos] que o seu novo valor está localizado em s, o que tem de errado nisso se s e p[pos] são ponteiros?

 

O problema não é esse cara, é a lógica em sim...muito dificil ajustar isso, você arruma de um lado estraga do outro...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olha, eu compilei teu código aqui, apenas retirei os "remover()" abaixo dos items, e mostrou comer - durmir - jogar numa boa!

se eu deixo um remover apenas, aparece durmir - jogar.

 

não está correto?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Teste todas as possibilidades, depois dos remover(), coloque uns inserir()...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Caraca, essa não foi fácil...mas tá ai :D

Acho que ta redondo agora ^^

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX 5

void inserir(char *s); //Inclui um evento da fila
void remover(); //Recupera um evento da fila

char *p[MAX];
int spos = 0;
int rpos = 0;

int main()
{
	inserir("comer");
	inserir("durmir");
	inserir("jogar");
	inserir("dancar");
	remover();
	remover();
	inserir("CORRER");
	remover();
	inserir("SAIR");
	//remover();
	//remover();
	
	for(int i=0; i<MAX; i++)
		printf("%d - %s\n",i,p[i]);

	system("pause");
	return(0);
}

void inserir(char *s)
{
	
	if((spos+1 == rpos) || ((spos+1 == MAX) && (!rpos)))
	{
		printf("Lista Cheia!\n\n");
		return;
	}
	if(spos == MAX)
	{
		spos = 0;
		p[spos] = s;
		spos++;
	}
	else if(spos+1 == MAX)
	{
		p[spos] = s;
		spos = 0;
	}
	else
	{
		p[spos] = s;
		spos++;
	}
}

void remover()
{
	if(rpos == MAX) rpos = 0;
	if(spos == rpos)
	{
		printf("Lista Vazia!\n\n");
		return;
	}
	p[rpos] = NULL;
	rpos++;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Agora recebi alguns (null), executei o código fazendo uma pequena alteração em um loop for, que está no int main()

 

antes (o meu gcc não me deixou compilar assim):

for(int i=0; i<MAX; i++)
		printf("%d - %s\n",i,p[i]);
depois:

int i;
for(i=0; i<MAX; i++)
		printf("%d - %s\n",i,p[i]);

e tive de output:

0-SAIR

1-(null)

2-(null)

3-dancar

4-CORRER

sh: pause not found (auehuaehuaehuaheuaeh, uso linux =P)

 

Agora eu tenho um dúvida, se é uma fila circular, funciona igualzinho uma fila de banco, um item (pessoa) entra, e deve percorrer o caminho todo para sair, correto?

então não poderia haver (null)'s no meio da fila, apenas no final ou no começo.

Antei vendo no google, e fila circular é um conceito meio polemico, haha, a sua fila deve sobrescrever algum item, ao tentar adicionar items numa lista cheia?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Dessa forma que eu fiz, senão existir um espaço em branco não tem como dar certo, outra coisa é que sempre vai caber 1 a menos que o definido em MAX(por conta do espaço em branco)...mas isso é só tratar quando for exibir a Fila :D

Não permite inserir item se a lista está cheia não. Agora se você observar o exemplo de Fila usando mod(link do primeiro post), esse sim não tem espaços em branco, eu implementei com mod aqui e ficou bem mais legível e limpo o código, veja lá ^^

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pois é, utilizando modulos fica MUITO mais legivel o código, eu ja tinha visto o link desde quando você postou o tópico.

Mas é isso!

O importante é que agora funciona :D :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Claro, mas quis fazer assim só pra quebrar a cabeça e entender como funciona mesmo =))

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.