gRoOvE 0 Denunciar post Postado Março 3, 2009 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
VictorCacciari 42 Denunciar post Postado Março 3, 2009 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
gRoOvE 0 Denunciar post Postado Março 3, 2009 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
VictorCacciari 42 Denunciar post Postado Março 3, 2009 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
gRoOvE 0 Denunciar post Postado Março 3, 2009 Teste todas as possibilidades, depois dos remover(), coloque uns inserir()... Compartilhar este post Link para o post Compartilhar em outros sites
gRoOvE 0 Denunciar post Postado Março 3, 2009 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
VictorCacciari 42 Denunciar post Postado Março 4, 2009 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
gRoOvE 0 Denunciar post Postado Março 4, 2009 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
VictorCacciari 42 Denunciar post Postado Março 4, 2009 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
gRoOvE 0 Denunciar post Postado Março 4, 2009 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