Baixe o app para aproveitar ainda mais
Esta é uma pré-visualização de arquivo. Entre para ver o arquivo original
/* Implementação de uma pilha dinâmica Autor: Igor S O Cardoso. */ #include <stdio.h> #include <stdlib.h> typedef struct elemento { int dado; struct elemento *proximo; }t_elemento; typedef struct pilha{ t_elemento *primeiro; t_elemento *ultimo; }t_pilha; t_pilha* criaPilha() { t_pilha *pilha = (t_pilha*)malloc(sizeof(t_pilha)); pilha->primeiro = NULL; pilha->ultimo = NULL; return pilha; } /*void empilhar(char valor, t_pilha *pilha){//Minha funçaõ de emplilhar t_elemento * novoprimeiro = (t_elemento *)malloc(sizeof(t_elemento)); novoprimeiro->dado = valor; novoprimeiro->proximo = pilha->primeiro; pilha->primeiro = novoprimeiro; if(pilha->ultimo == NULL){ pilha->ultimo = novoprimeiro; } }*/ void empilhar(char valor, t_pilha *pilha) { t_elemento *novo = (t_elemento*)malloc(sizeof(t_elemento)); novo->dado = valor; novo->proximo = NULL; if(pilha->primeiro == NULL) { //Se a lista estiver vazia pilha->primeiro = novo; }else { novo->proximo = pilha->primeiro; pilha->primeiro = novo; /*Meu pilha->primeiro aponta para o novo, e novo passa a ser o primeiro elemento da pilha*/ } } int desempilha(t_pilha *pilha) {/* Recebe só a pinha como argumento, pois o elemento a ser sempilhado(excluido) é sempre o primeiro*/ int primer = pilha->primeiro->dado; t_elemento *removido; removido = pilha->primeiro; pilha->primeiro = pilha->primeiro->proximo; /*Meu pilha->primeiro aponta para o meu proximo. Primeiro elemento (topo da pilha) passa a ser o meu proximo elemento (que estava de baixo).*/ free(removido); /*Remove o ex-topo da pilha.*/ if(pilha->primeiro == NULL) { pilha->ultimo = NULL; } return primer; /*Retorna o elemento que foi removido da pihla, ou seja, o ex-topo da pilha*/ } void Destruir(int t, t_pilha *pilha) { while(t--) { t_elemento *removido; removido = pilha->primeiro; pilha->primeiro = pilha->primeiro->proximo; free(removido); } if(pilha->primeiro == NULL) { pilha->ultimo = NULL; } } int esta_vazia(t_pilha *pilha) { /*Verifica se o topo da pilha esta vazio, caso sim, a pilha esta vazia*/ if(pilha->primeiro == NULL) { printf("Pilha esta fazia!\n"); return 1; }else { return 0; } } int tamanho_pilha(t_pilha *pilha) { /*Tanto faz passar o endereço ou uma copia da pilha*/ t_elemento *aux = pilha->primeiro; int tamanho = 0; while(aux != NULL) { aux = aux->proximo; //Vai "andando" pela pilha tamanho++; } return tamanho; } void imprimir(t_pilha *pilha){ t_elemento *atual = pilha->primeiro; while(atual != NULL){ printf("%d ",atual->dado); atual = atual->proximo; } printf("\nFIM DA PILHA\n"); } void menu() { printf("PILHA DINAMICA\n"); printf("1) Inserir\n"); printf("2) Remover\n"); printf("3) Imprimir\n"); printf("4) Tamanho\n"); printf("5) Destruir\n"); printf("0) Sair\n"); } int main(void) { int opcao = 1, quantidade, elemento; t_pilha *pilha = criaPilha(); while(1) { menu(); printf("Digite a opecao: "); scanf("%d", &opcao); //system("cls"); if(opcao == 0){ quantidade = tamanho_pilha(pilha); Destruir(quantidade, pilha); printf("Bay Bay!\n"); break; } else if(opcao == 1) { printf("Quantidade de elemento(s): "); scanf("%d", &quantidade); while(quantidade--) { printf("Digite o elemento: "); scanf("%d", &elemento); empilhar(elemento, pilha); } } else if(opcao == 2) { printf("Removendo...\n"); printf("Elemento removido: \n", desempilha(pilha)); } else if(opcao == 3) { printf("Pilha: "); imprimir(pilha); } else if(opcao == 4) { if(esta_vazia(pilha) == 0) { printf("Tamanho da pilha: %d\n", tamanho_pilha(pilha)); } } else if(opcao == 5) { quantidade = tamanho_pilha(pilha); Destruir(quantidade, pilha); esta_vazia(pilha); } } quantidade = tamanho_pilha(pilha); Destruir(quantidade, pilha); esta_vazia(pilha); return 0; }
Compartilhar