Ir ao conteúdo
  • Cadastre-se

Ajuda em pilha


lucastkk

Posts recomendados

Estou com problema neste programa em C para simplesmente adicionar valores em uma pilha e imprimir o conteúdo, e não consigo encontrar o erro:

o problema é que quando você entra com um valor, um novo elemento é criado na pilha e ele também substitui o antigo. Ficando com 2 elementos iguais.

#include <stdio.h>

#include <stdlib.h>

typedef struct tipoelemento{

int *info;

struct tipoelemento *prox;

}elemento;

typedef struct tipopilha{

elemento *topo;

int tamanho;

}pilha;

pilha* cria(void){

pilha *p = (pilha *) malloc(sizeof(pilha));

p->topo = NULL;

p->tamanho = 0;

return p;

}

pilha* empilha(pilha *p, int *v){

elemento *novo;

if ((novo=(elemento *)malloc(sizeof(elemento)))!= NULL){

novo->info= v;

novo->prox= p->topo;

p->topo=novo;

p->tamanho++;

return p;

}

printf("Erro, falta de memória");

return NULL;

}

pilha* desempilha(pilha *p){

elemento *remov;

if(p->tamanho == 0){

printf("Pilha vazia");

return p;

}

remov = p->topo;

p->topo = p->topo->prox;

free(remov->info);

free(remov);

p->tamanho--;

return p;

}

void imprimir (pilha *p){

elemento *aux;

int i;

aux= p->topo;

if(p->tamanho == 0){

printf("Pilha vazia\n");

return;

}

printf("***TOPO***\n");

for(i=0; i<p->tamanho; i++){

printf("%d\n", *aux->info);

aux=aux->prox;

}

printf("***FIM***\n\n");

}

int main(){

pilha *p;

int *v;

if((p=(pilha *) malloc(sizeof(pilha))) == NULL)

return -1;

if((v=(int *)malloc(sizeof(int))) == NULL)

return -1;

p= cria();

printf("Digite um valor para a pilha: ");

scanf("%d", v);

while(*v!=0){

empilha(p, v);

imprimir(p);

printf("Digite um valor para a pilha: ");

scanf("%d", &*v);

}

return 0;

}

Link para o comentário
Compartilhar em outros sites

Te recomendo a usar break-points na sua função empilha ! Depois poste o que ocorreu com a função empilha aqui para arrumar lógica. Normalmente esses erros de valores iguais em pilha esta geralmente ligado ao incremento e decremento do "p->topo". Só tome cuidado com esses seus scanf . . .

scanf("%d", v);
scanf("%d", &*v);

Link para o comentário
Compartilhar em outros sites

Arrumei a função empilha pra você . . . T++ ^_^

#include <stdio.h>
#include <stdlib.h>
typedef struct elemento{
int *info;
elemento *prox;
}elemento;

typedef struct tipopilha{
elemento *topo;
int tamanho;
}pilha;

void empilha(pilha *p, int *v){
elemento *aux = p->topo;
elemento *novo = (elemento *) malloc(sizeof(elemento));
if(aux == NULL){
novo->info = v;
p->topo = novo;
p->tamanho++;
novo->prox = NULL;
p->topo->prox = NULL;
return ;
}
while(aux->prox != NULL)
aux = aux->prox;
novo->info = v;
aux->prox = novo;
p->tamanho++;
novo->prox = NULL;
}

void imprimir (pilha *p){
elemento *aux;
int i;
aux = p->topo;
if(p->tamanho == 0){
printf("Pilha vazia\n");
return;
}
printf("***TOPO***\n");
for(i = 0; i < p->tamanho; i++){
printf("%d\n", aux->info);
aux = aux->prox;
}
printf("***FIM***\n\n");
}

pilha *cria(){
pilha *p;
p = (pilha *) malloc(sizeof(pilha));
p->topo = NULL;
p->tamanho = 0;
return p;
}

int main(){
pilha *p = cria();
int *v;
printf("Digite um valor para a pilha: ");
scanf("%d", &v);
fflush(stdin);
while(v != 0){
empilha(p,v);
imprimir(p);
printf("Digite um valor para a pilha: ");
scanf("%d", &v);
fflush(stdin);
}
return 0;
}

Tirei o que era desnecessário como as alocações do 'v' e malloc de pilha logo no inicio, também tirei o retorno da função empilha, e outra coisas você vai ver . . . . . . Se vocÊ quiser deixar o código mais rápido crie um ponteiro na raiz da pilha que aponte sempre pro ultimo elemento da pilha e coloque ele no while da função empilha.

Link para o comentário
Compartilhar em outros sites

Arquivado

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

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades 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

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!