Problemas com listas

21/10/2018

4

C

Olá, pessoal, preciso da ajuda de vocês. Estou tentando criar uma pilha em C, mas estou tendo problemas com a função desempilha. Como vocês podem ver eu até coloquei o comando printf("\\\\n===OK"); para saber quando o código é lido lá, mas nada nem chega a aparecer. Há algum problema? Desde já agradeço.

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

#define MaxTam 1000

typedef struct {
int info;
} TipoItem;

typedef struct {
TipoItem Item[MaxTam];
int Topo;
} TipoPilha;

void FPVazia(TipoPilha *Pilha)
{
Pilha->Topo = 0;
} /* FPVazia */

int Vazia(TipoPilha* pPilha)
{
return (pPilha->Topo == 0);
} /* Vazia */

void Empilha(TipoItem x, TipoPilha *pPilha)
{
if (pPilha->Topo == MaxTam){
printf("\\\\nErro, pilha cheia\\\\n\\\\n");
}
else
{
pPilha->Item[pPilha->Topo] = x;
pPilha->Topo++;
}
} /* Empilha */

void Desempilha(TipoPilha *pPilha, TipoItem *Item)
{
if (Vazia(pPilha)){
printf("\\\\nErro, pilha vazia\\\\n");
}
else
{
pPilha->Topo--;
*Item = pPilha->Item[pPilha->Topo];
printf("\\\\n===OK");
}
} /* Desempilha */

int Tamanho(TipoPilha* pPilha)
{
return (pPilha->Topo);
} /* Tamanho */

int main()
{
TipoPilha *Pilha;
Pilha = (TipoPilha*) malloc(sizeof(TipoPilha));

TipoItem *Item1, *Item2, *Item3, a, b, c;
a.info = 2;
b.info = 5;
c.info = 1;

Desempilha(Pilha, Item1);


Empilha(a, Pilha);
Empilha(b, Pilha);
Empilha(c, Pilha);

Desempilha(Pilha, Item1);
Desempilha(Pilha, Item2);
Desempilha(Pilha, Item3);

printf("\\\\nPilha = (TOPO) %d %d %d (BASE)\\\\n", Item1->info, Item2->info, Item3->info);

return 0;
}
Responder

Posts

07/07/2019

João Júnior

Olá, pessoal, preciso da ajuda de vocês. Estou tentando criar uma pilha em C, mas estou tendo problemas com a função desempilha. Como vocês podem ver eu até coloquei o comando printf("\\\\\\\\n===OK"); para saber quando o código é lido lá, mas nada nem chega a aparecer. Há algum problema? Desde já agradeço.

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

#define MaxTam 1000

typedef struct {
int info;
} TipoItem;

typedef struct {
TipoItem Item[MaxTam];
int Topo;
} TipoPilha;

void FPVazia(TipoPilha *Pilha)
{
Pilha->Topo = 0;
} /* FPVazia */

int Vazia(TipoPilha* pPilha)
{
return (pPilha->Topo == 0);
} /* Vazia */

void Empilha(TipoItem x, TipoPilha *pPilha)
{
if (pPilha->Topo == MaxTam){
printf("\\\\\\\\nErro, pilha cheia\\\\\\\\n\\\\\\\\n");
}
else
{
pPilha->Item[pPilha->Topo] = x;
pPilha->Topo++;
}
} /* Empilha */

void Desempilha(TipoPilha *pPilha, TipoItem *Item)
{
if (Vazia(pPilha)){
printf("\\\\\\\\nErro, pilha vazia\\\\\\\\n");
}
else
{
pPilha->Topo--;
*Item = pPilha->Item[pPilha->Topo];
printf("\\\\\\\\n===OK");
}
} /* Desempilha */

int Tamanho(TipoPilha* pPilha)
{
return (pPilha->Topo);
} /* Tamanho */

int main()
{
TipoPilha *Pilha;
Pilha = (TipoPilha*) malloc(sizeof(TipoPilha));

TipoItem *Item1, *Item2, *Item3, a, b, c;
a.info = 2;
b.info = 5;
c.info = 1;

Desempilha(Pilha, Item1);


Empilha(a, Pilha);
Empilha(b, Pilha);
Empilha(c, Pilha);

Desempilha(Pilha, Item1);
Desempilha(Pilha, Item2);
Desempilha(Pilha, Item3);

printf("\\\\\\\\nPilha = (TOPO) %d %d %d (BASE)\\\\\\\\n", Item1->info, Item2->info, Item3->info);

return 0;
}


Piá, use a opção de inserção de código [</>] da página, poque do jeito que tu colocou ficou ruim de ler o código. Bom, essa é pilha estática (usa as 'células' do vetor como nós. Eu tenho um projeto pronto aqui, veja:

Main.c
#include<stdio.h>
#include<stdlib.h>
#include<conio2.h>
#include "PilhaEstatica.h"

void exibirMenu();
int lerOpcao();
void informarAluno(struct Aluno *estudante);
int confirmarRemocao(Pilha *pilha);

int main(){
    int opcao = 0,
        retorno;
    Pilha *pilha = NULL;
    pilha = criarPilha();
    struct Aluno estudante;

    textcolor(15);
    printf("\\n\\tPila Estática\\n\\n");
    textcolor(7);

    do{
        switch(opcao){
            case 0:
                exibirMenu();
                break;

            case 1:
                informarAluno(&estudante);
                retorno = push(pilha, estudante);
                if(retorno){
                    textcolor(15);
                    printf("\\n\\tAluno inserido na pilha com sucesso!\\n");
                    textcolor(7);
                }else{
                    textcolor(15);
                    printf("\\n\\tNão foi possível inserir o aluno na pilha!\\n");
                    textcolor(7);
                }
                break;

            case 2:
                retorno = pop(pilha);
                if(retorno){
                    textcolor(15);
                    printf("\\tAluno removido da pilha com sucesso!\\n");
                    textcolor(7);
                }else{
                    textcolor(15);
                    printf("\\tNão foi possível remover o aluno da pilha!\\n");
                    textcolor(7);
                }
                break;

            case 3:
                textcolor(15);
                printf("\\n\\tAlunos cadastrados: ");
                textcolor(9);
                printf("%d\\n\\n", tamanhoPilha(pilha));
                textcolor(7);
                break;

            case 4:
                retorno = pull(pilha, &estudante);
                exibirConsulta(retorno, &estudante);
                break;

            case 5:
                emitirRelatorio(pilha);
                break;

            case 99:
                exit(0);
                break;

            default:
                exibirMenu();
        }
        opcao = lerOpcao();

    }while(opcao != 99);

    destruirPilha(pilha);

    textcolor(8);
    return 0;
}

void exibirMenu(){
    textcolor(10);
    printf("\\n\\t0  - Exibir o menu de opções\\n"
           "\\t1  - Inserir aluno na pilha\\n"
           "\\t2  - Remover aluno da pilha\\n"
           "\\t3  - Exibir o número de alunos cadastrados\\n"
           "\\t4  - Consultar a pilha\\n"
           "\\t5  - Emitir relatório\\n"
           "\\t99 - Sair do programa.\\n\\n");
    textcolor(7);
}

int lerOpcao(){
    int opcaoDesejada;

    textcolor(15);
    printf("\\n\\tOpção escolhida: ");
    textcolor(14);
    scanf("%d", &opcaoDesejada);
    printf("\\n");
    setbuf(stdin, NULL);
    textcolor(7);

    return opcaoDesejada;
}

void informarAluno(struct Aluno *estudante){
    textcolor(7);
    printf("\\n\\tMatrícula: ");
    textcolor(14);
    scanf("%d", &estudante->matricula);
    setbuf(stdin, NULL);

    textcolor(7);
    printf("\\tNome: ");
    textcolor(14);
    scanf("%49[^\\n]s", estudante->nome);
    setbuf(stdin, NULL);

    textcolor(7);
    printf("\\tNota do 1º bimestre: ");
    textcolor(14);
    scanf("%f", &estudante->notaBim1);
    setbuf(stdin, NULL);

    textcolor(7);
    printf("\\tNota do 2º bimestre: ");
    textcolor(14);
    scanf("%f", &estudante->notaBim2);
    setbuf(stdin, NULL);

    textcolor(7);
    printf("\\tNota do 3º bimestre: ");
    textcolor(14);
    scanf("%f", &estudante->notaBim3);
    setbuf(stdin, NULL);

    textcolor(7);
    printf("\\tNota do 4º bimestre: ");
    textcolor(14);
    scanf("%f", &estudante->notaBim4);
    setbuf(stdin, NULL);
}

int confirmarRemocao(Pilha *pilha){
    char confirmacao;
    if(!pilhaVazia(pilha)){
        textcolor(14);
        scanf("%c", &confirmacao);
        setbuf(stdin, NULL);
        textcolor(7);

        if(confirmacao == 'S' || confirmacao == 's') return 1;
        else if(confirmacao == 'N' || confirmacao == 'n') return 0;

        if(confirmacao != 'S' || confirmacao != 's' || confirmacao != 'N' || confirmacao != 'n'){
            textcolor(12);
            printf("\\tOpção inválida!\\n\\n");
            textcolor(7);
        }
    }else{
        textcolor(12);
        printf("\\tNão há alunos cadastrados!\\n\\n");
        textcolor(7);
    }

    return 0;
}


Protótipos.h
#define MAX 50

struct Aluno{
    int matricula;
    char nome[50];
    float notaBim1,
          notaBim2,
          notaBim3,
          notaBim4;
};

typedef struct Pilha Pilha;

/*Protótipos*/
Pilha* criarPilha();
void destruirPilha(Pilha *p);
int tamanhoPilha(Pilha *p);
int pilhaVazia(Pilha *p);
int pilhaCheia(Pilha *p);
int push(Pilha *p, struct Aluno a);
int pop(Pilha *p);
int pull(Pilha *p, struct Aluno *a);
void exibirConsulta(int s, struct Aluno *estudante);
void emitirRelatorio(Pilha *p);


Implementacao.c
#include<stdio.h>
#include<stdlib.h>
#include<conio2.h>
#include "PilhaEstatica.h"

struct Pilha{
    int quantidade;
    struct Aluno aluno[MAX];
};

Pilha* criarPilha(){
    Pilha *pilha = (Pilha*) malloc(sizeof(Pilha));

    if(pilha != NULL)
        pilha->quantidade = 0;

    return pilha;
}

void destruirPilha(Pilha *pilha){
    free(pilha);
}

int tamanhoPilha(Pilha *pilha){
    if(pilha == NULL) return -1;
    else
        return pilha->quantidade;
}

int pilhaVazia(Pilha *pilha){
    if(pilha == NULL) return -1;
    return (pilha->quantidade == 0);
}

int pilhaCheia(Pilha *pilha){
    if(pilha == NULL) return -1;
    return (pilha->quantidade == MAX);
}

/*Colocar um nó*/
int push(Pilha *pilha, struct Aluno aln){
    if(pilha == NULL || pilhaCheia(pilha)) return 0;

    pilha->aluno[pilha->quantidade] = aln;

    pilha->quantidade++;

    return 1;
}

/*Retirar um nó*/
int pop(Pilha *pilha){
    if(pilha == NULL || pilhaVazia(pilha)) return 0;

    pilha->quantidade--;

    return 1;
}

int pull(Pilha *pilha, struct Aluno *aln){
    if(pilha =
Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários. Para saber mais sobre o uso de cookies,
consulte nossa política de privacidade. Ao continuar navegando em nosso site, você concorda com a nossa política.

Aceitar