Ir para conteúdo

POWERED BY:

Arquivado

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

viciado

[Resolvido] Pilha em C

Recommended Posts

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

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

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

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

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

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

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

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

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

×

Informação importante

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