viciado 1 Denunciar post Postado Setembro 19, 2009 Tentei fazer PILHA, mais tem muitos erros #include <stdio.h> #include <stdlib.h> typedef struct pilha{ int n; struct pilha *prox; }no; typedef no* PILHA; void inic(PILHA *P){ *P = NULL; } void push(PILHA *P, int n){ no *tmp; tmp = (no*) malloc(sizeof(no)); if(tmp==NULL) return; tmp->n = n; tmp->prox = *P; *P = tmp; } int empty(PILHA *P){ return (P==NULL); } void pop(PILHA P){ no *tmp = *P; if(empty(*P)) return; *P = (*P)->prox; free(tmp); } int top(PILHA *P){ if(empty(P)) return -1; else return(P->n); } void(PILHA *P){ if(empty(P)) return; printf("%d \n",P->n); print(P->prox); } int main() { no *pilha; inic(&pilha); puts("Push 10, 20 e 30"); push(&pilha,10); push(&pilha,20); push(&pilha,30); printf("Topo: %d \n",top(&pilha)); puts("Retirada"); pop(&pilha); puts("A pilha:"); print(pilha); system("PAUSE"); return 0; } Compartilhar este post Link para o post Compartilhar em outros sites
VictorCacciari 42 Denunciar post Postado Setembro 19, 2009 Fala viciado... Não é querendo ser chato, mas você podia indicar os erros! Não é sempre que da tempo de compilar o código do pessoal. Mas tudo bem, vamos lá. Compilei, e obtive o seguinte: victor@matrix:~/Desktop$ gcc -Wall -Wextra -g pilha.c pilha.c: In function ‘pop’: pilha.c:29: error: incompatible types in initialization pilha.c:30: error: incompatible type for argument 1 of ‘empty’ pilha.c:32: error: invalid type argument of ‘->’ pilha.c: In function ‘top’: pilha.c:38: error: request for member ‘n’ in something not a structure or union pilha.c:39: warning: control reaches end of non-void function pilha.c: At top level: pilha.c:41: error: expected ‘)’ before ‘*’ token pilha.c: In function ‘main’: pilha.c:57: warning: passing argument 1 of ‘pop’ from incompatible pointer type pilha.c:59: warning: implicit declaration of function ‘print’ victor@matrix:~/Desktop$ Na função pop, os três erros podem ser resolvidos arrumando os parametros. Falta um asterisco, indicando que "P" é um ponteiro para "PILHA" Na função top, arrume o return. Deve ser "return (*P)->n;" Antes da main tem uma função, sem nome... Julgo que é a função "print" Depois dessas correções, obitve o seguinte output do compilador: victor@matrix:~/Desktop$ gcc -Wall -Wextra -g pilha.c pilha.c: In function ‘pop’: pilha.c:30: warning: passing argument 1 of ‘empty’ from incompatible pointer type pilha.c: In function ‘print’: pilha.c:45: error: request for member ‘n’ in something not a structure or union pilha.c:46: error: request for member ‘prox’ in something not a structure or union pilha.c: In function ‘main’: pilha.c:61: warning: passing argument 1 of ‘print’ from incompatible pointer type Na função pop, chame por "empty(P)" e não "empty(*P)" Na função print, mude para: void print(PILHA *P){ if(empty(P)) return; printf("%d \n", (*P)->n); print(&((*P)->prox)); //p->prox é um "*no", mas nos queremos um **no. } E por último, na função main, chame por print(&pilha) Após essas correções, não obitve erros na compilação, mas... victor@matrix:~/Desktop$ gcc -Wall -Wextra -g pilha.c victor@matrix:~/Desktop$ ./a.out Push 10, 20 e 30 Topo: 30 Retirada A pilha: 20 10 Segmentation fault victor@matrix:~/Desktop$ Você precisará rever o seu código. (E já te dou a dica: O erro está na hora de parar de imprimir. Teu código não sabe reconhecer uma pilha vazia. ) Note que todos os erros foram resolvidos apenas por ler as mensagens do compilador. E eram todos errinhos "bobos", relativos a sintaxe da linguagem. quando for compilar um código, compile com as opções "-Wall -Wextra" para obter todas as mensagens possíveis. Compartilhar este post Link para o post Compartilhar em outros sites
viciado 1 Denunciar post Postado Setembro 19, 2009 Na função top, arrume o return. Deve ser "return (*P)->n;" Por que tem que ser (*P)->n ? Na função pop, chame por "empty(P)" e não "empty(*P)" Também não entendi o motivo Obrigado pelas dicas, na próxima eu coloco os erros Compartilhar este post Link para o post Compartilhar em outros sites
VictorCacciari 42 Denunciar post Postado Setembro 19, 2009 Por que tem que ser (*P)->n ? P é um ponteiro para um ponteiro para um "no".(*P) é um ponteiro para um "no". (*(*P)) é um "no". chamar (*(*P)).n é o mesmo que chamar (*P)->n. Na função pop, chame por "empty(P)" e não "empty(*P)" Exatamente a mesma coisa."empty" recebe um ponteiro para um ponteiro para um "no". Compartilhar este post Link para o post Compartilhar em outros sites
viciado 1 Denunciar post Postado Setembro 19, 2009 Por que tem que ser (*P)->n ? P é um ponteiro para um ponteiro para um "no".(*P) é um ponteiro para um "no". (*(*P)) é um "no". chamar (*(*P)).n é o mesmo que chamar (*P)->n. Na função pop, chame por "empty(P)" e não "empty(*P)" Exatamente a mesma coisa."empty" recebe um ponteiro para um ponteiro para um "no". Agora funciona só estou recebendo um warning 42 [Warning] passing arg 1 of `empty' from incompatible pointer type #include <stdio.h> #include <stdlib.h> typedef struct pilha{ int n; struct pilha *prox; }no; typedef no* PILHA; void inic(PILHA *P){ *P = NULL; } void push(PILHA *P, int n){ no *tmp; tmp = (no*) malloc(sizeof(no)); if(tmp==NULL) return; tmp->n = n; tmp->prox = *P; *P = tmp; } int empty(PILHA *P){ return (P==NULL); } void pop(PILHA *P){ no *tmp = *P; if(empty(P)) return; *P = (*P)->prox; free(tmp); } int top(PILHA *P){ if(empty(P)) return -1; else return((*P)->n); } void print(PILHA *P){ if(empty(*P)) return; printf("%d \n",(*P)->n); print(& (*P)->prox); } int main() { no *pilha; inic(&pilha); puts("Push 10, 20 e 30"); push(&pilha,10); push(&pilha,20); push(&pilha,30); printf("Topo: %d \n",top(&pilha)); puts("Retirada"); pop(&pilha); puts("A pilha:"); print(&pilha); system("PAUSE"); return 0; } Compartilhar este post Link para o post Compartilhar em outros sites
VictorCacciari 42 Denunciar post Postado Setembro 19, 2009 Olhe a sua função "print" você está passando um ponteiro para um nó na chamada "empty(*P)", o correto seria "empty(P)" Eu inclusive ja havia dito isso ali em cima. Compartilhar este post Link para o post Compartilhar em outros sites
viciado 1 Denunciar post Postado Setembro 19, 2009 Olhe a sua função "print" você está passando um ponteiro para um nó na chamada "empty(*P)", o correto seria "empty(P)" Eu inclusive ja havia dito isso ali em cima. Sim. Só que se eu utilizar empty(P) o programa da erro e finaliza Compartilhar este post Link para o post Compartilhar em outros sites
VictorCacciari 42 Denunciar post Postado Setembro 19, 2009 Eu sei. O programa da erro pois a sua função empty está errada! E eu também ja te disse isso. Você esta checando se um ponteiro para um ponteiro para um "no" é nulo, não se o ponteiro para um "nó" é nulo. Percebbe a diferença? Uma dica que te dou, é não fazer isso: typedef no* PILHA; apenas torna o código mais confuso.Mais vale delcarar as funções como, por exemplo: void pop(no** pilha); Assim temos total certeza to tipo do ponteiro, sem precisar ficar pensando que "PILHA" equivale a um "*no" Compartilhar este post Link para o post Compartilhar em outros sites
viciado 1 Denunciar post Postado Setembro 19, 2009 Eu sei. O programa da erro pois a sua função empty está errada! E eu também ja te disse isso. Você esta checando se um ponteiro para um ponteiro para um "no" é nulo, não se o ponteiro para um "nó" é nulo. Percebbe a diferença? Uma dica que te dou, é não fazer isso: typedef no* PILHA; apenas torna o código mais confuso.Mais vale delcarar as funções como, por exemplo: void pop(no** pilha); Assim temos total certeza to tipo do ponteiro, sem precisar ficar pensando que "PILHA" equivale a um "*no" Obrigado Compartilhar este post Link para o post Compartilhar em outros sites