Ir ao conteúdo

C Implementação Pilha Dinâmica em C


Ir à solução Resolvido por MassakiMsk,

Posts recomendados

Postado

Estou tentando implementar uma pilha dinâmica só que está dando erro na função remover, quando vai pra remover o ultimo valor o programa da erro e precisa ser encerrado.

Coloquei um printf no "dado" da função PILHA_pop e percebi que estava removendo o penultimo elemento ao invés do ultimo. Como faço para consertar isso? onde estou errando? As demais funções estão corretas?

 

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

typedef struct elem
{
    int data;
    struct elem *prox;
} elem;


typedef struct pilha
{
    struct elem *topo;
} pilha;


pilha *PILHA_construtor()
{
    pilha *p = (pilha*)malloc(sizeof(pilha));
    if(p==NULL)
        exit(1);
    else
        p->topo = NULL;
    return p;
}

bool PILHA_vazia(pilha *p)
{
    if (p->topo == NULL)
        return true;
    else
        return false;
}

int PILHA_tamanho(pilha *p)
{
    elem *aux = p->topo;
    int tam = 0;
    while(aux!= NULL)
    {
        tam++;
        aux = aux->prox;
    }
    return tam;
}

void PILHA_exibir(pilha *p)
{
    elem *aux = p->topo;
    printf("Pilha: \"");
    while(aux!= NULL)
    {
        printf("%d ",aux->data);
        aux = aux->prox;
    }
    printf("\"\n");
}


bool PILHA_push(pilha *p, elem *dado)
{
    elem *novo = (elem*)malloc(sizeof(elem));
    novo->data = dado;
    novo->prox = p->topo;
    p->topo = novo;
    return true;
}

bool PILHA_pop(pilha *p, elem *dado)
{
    elem *aux;

    if (PILHA_vazia(p))
        return false;
    else
    {
        aux = p->topo;
        p->topo = aux->prox;
        dado = aux->prox->data;
        free(aux);
    }
}

int main()
{
    pilha *p = PILHA_construtor();
    int op;
    int num;
    do{
    printf("1 - POP, 2 - PUSH , 3 - SAIR: ");
    scanf("%d",&op);
    if (op == 1){
        printf("Digite um numero: ");
        scanf("%d",&num);
        PILHA_push(p,num);
        PILHA_exibir(p);
    }
    else if(op == 2){
        PILHA_pop(p,num);
        PILHA_exibir(p);
    }
    else{
        free(p);
    }
    }while(op!= 0 && op!= 3);
    return 0;
}

 

  • Solução
Postado

você esta removendo o ultimo mas pegando o valor do penultimo por pegar o proximo elemento apontado pelo topo. 

é só tirar o ->prox e deixar assim na função pop

dado = aux->data;

adicionado 1 minuto depois

O erro ocorre provavelmente quando você tenta remover o elemento de uma pilha com só um valor salvo. ele tenta pegar o prox, mas o prox do primeiro é NULL

  • Obrigado 1
Postado
4 minutos atrás, MassakiMsk disse:

você esta removendo o ultimo mas pegando o valor do penultimo por pegar o proximo elemento apontado pelo topo. 

é só tirar o ->prox e deixar assim na função pop

dado = aux->data;

Algo tão simples e eu apanhando, malditos ponteiros rs

 

Muito obrigado @MassakiMsk !!

 

 

 

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

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...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!