Ir ao conteúdo
  • Cadastre-se

C exercício de Pilha dinâmica


Posts recomendados

Como ficaria o código das funções da minha pilha dinâmica se eu quisesse que ela fosse uma pilha de nomes (char[50]) ao invés de uma pilha de inteiros? @devair1010@Lucca Rodrigues 

#include<stdio.h>
#include<malloc.h>

#define TAMANHO_MAXIMO 10

typedef struct nodo {
  char nome [50];
  struct nodo* prox;
} NODO;

typedef struct {
	NODO* topo;
} PILHA;

void inicializarPilha(PILHA* pilha);
void limpaPilha(PILHA* pilha);
void imprimirPilha(PILHA* pilha);
int push(PILHA* pilha, char nome);
void pop(PILHA* pilha);
int length(PILHA* pilha);

int main () {
	PILHA minhaPilha;

	inicializarPilha(&minhaPilha);
	
	push(&minhaPilha, 2);
	push(&minhaPilha, 4);
	push(&minhaPilha, 6);
	
	imprimirPilha(&minhaPilha);

	pop(&minhaPilha);
	
	imprimirPilha(&minhaPilha);
	
	limpaPilha(&minhaPilha);
	
	imprimirPilha(&minhaPilha);
	
}

void pop(PILHA* pilha){
	if(pilha->topo != NULL){
    NODO* apagar;
    apagar = pilha->topo;

    pilha->topo = apagar->prox;
    
    free(apagar);
	}
}

int push(PILHA* pilha, char nome) {
  NODO* novo = (NODO*) malloc(sizeof(NODO));
  //NODO novo;
  novo->nome = nome;

  novo->prox = pilha->topo; //ANTIGO

  pilha->topo = novo; //TOPO NOVO
	
	return 1;
}

void inicializarPilha(PILHA* pilha) {
	pilha->topo = NULL;
}

void limpaPilha(PILHA* pilha) {
  NODO* apagar;
  NODO* posicao = pilha->topo;

  while(posicao != NULL){
    apagar = posicao;
    posicao = posicao->prox;
    free(apagar);
  }

	pilha->topo = NULL;
}

int length(PILHA* pilha) {
	NODO* element = pilha->topo;
  int contador = 0;

  while (element != NULL){
    contador++;
    element = element->prox;
  }

  return contador;
}

void imprimirPilha(PILHA* pilha) {
	printf("PILHA :)\n");
  NODO* element = pilha->topo;

	while(element != NULL){
		printf("|_%d_|\n", element->nome);
    element = element->prox;
  }
		
	printf("\n\n");
}

 

Link para o comentário
Compartilhar em outros sites

@Matheus Freitas Cada nó tem um campo para os dados, por que não cria um ponteiro para o nome na declaração de seu nó?

typedef struct nodo {
    char* nome;
    struct nodo* prox;
} NODO;

Dessa forma, o segundo parâmetro de push() também pode ser um ponteiro:

int push(PILHA* pilha, char* nome);

Você tem que fazer essa mudança tanto na definição quanto na declaração da função.

Por conseguinte, basta fazer:

novo->nome = nome;

Daí um nome aponta para o mesmo lugar que o outro :D

fica meio confuso usar variáveis com o mesmo nome, sugiro mudar isso.

Outras coisas que você deverá alterar/acrescentar:

Na função imprimirPilha(), você está usando o especificador de inteiros %d quando chama a printf(), use o %s.

Na main(), o segundo argumento que você tem que passar pra push() é uma string, não um inteiro.

Faça pop() retornar os dados do nó que deve ser retirado da pilha, ou seja:

char* pop(PILHA* pilha);

Crie uma função para verificar se a pilha está vazia, é o padrão:

int isEmpty(PILHA pilha) {
    // Retorna 1 se estiver vazia
    // Retorna 0 se nao estiver
    return pilha == NULL;
}

Você pode chamá-la na função pop().

Link para o comentário
Compartilhar em outros sites

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