Problemas com listas
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<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;
}
#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;
}
João Xavier
Curtidas 0
Respostas
João Júnior
21/10/2018
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<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;
}
#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 =
GOSTEI 0