Função Listar - Pilhas na Linguagem C

8 respostas
paloma

Alguém pode me ajudar? Tá dando um erro na função listar

ERRO: struct Sapato' has no member named 'topo'

Pelo que entendi, o erro indica que o ponteiro topo não faz parte da struct sapato, mas eu declarei topo como sendo um ponteiro para sapato, não está correto?

//DIRETIVAS 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <conio.h>
#define MAX 21

//ESTRUTURA
typedef struct Sapato{
        char marca[MAX];
        char modelo[MAX];
        char cor[MAX];
        int num;
        struct Sapato *prox;
        };
        
//VARIÁVEIS GLOBAIS
char marca[MAX], modelo[MAX], cor[MAX];
int num;
Sapato *topo;//ponteiro para o topo da pilha

//FUNÇÃO AUXILIAR LER DADOS 
void dados_sapato()
{
     system("cls");
     
     printf ("\nEntre com a marca do sapato: ");
     fflush (stdin);
     fgets (marca, MAX, stdin);
     
     printf ("Entre com o modelo do sapato: ");
     fflush (stdin);
     fgets (modelo, MAX, stdin);
     
     printf ("Entre com a cor do sapato: ");
     fflush (stdin);
     fgets (cor, MAX, stdin);
     
     printf ("Entre com o numero do sapato: ");
     fflush (stdin);
     scanf ("%d", &num);
}

//FUNÇÃO INSERIR
void push_sapato()
{
     dados_sapato();//chamando a função
     
     Sapato *pnovo=(Sapato*)malloc(sizeof(Sapato));//alocando memoria para os novos elementos
     strcpy(pnovo->marca,marca);
     strcpy(pnovo->modelo,modelo);
     strcpy(pnovo->cor,cor);
     pnovo->num=num;
     pnovo->prox=NULL;
     
     if(topo==NULL)//se a pilha estiver vazia
     topo=pnovo; //topo recebe o novo elemento
     
     else{
          pnovo->prox=topo; 
          topo=pnovo;
          }
}

//FUNÇÃO EXCLUIR
void pop_sapato()
{
     Sapato *aux;
     
     if(topo==NULL){
                    printf ("\n\nErro, pilha de sapatos vazia.\n\n");
                    return;
                    }
                    
                    else{
                         aux=topo;
                         topo=topo->prox;
                         free(aux);
                         }
}

//FUNÇÃO LISTAR
void listar_sapatos()
{
     Sapato *aux;
     
     aux=topo;
     
     while(aux!=NULL){
                      printf ("\t\t\tDADOS SAPATO\n\n");
                      printf ("Marca: %s", aux->marca);
                      printf ("Modelo: %s", aux->modelo);
                      printf ("Cor: %s", aux->cor);
                      printf ("Numero: %d", aux->num);
                      
                      aux=aux->topo;
                      } 
}

//FUNÇÃO PRINCIPAL
int main()
{
    char op;
    topo=NULL;//incializando a pilha como vazia
   
   do{
       system("cls");
       
       printf ("\t\t\tFABRICA DE SAPATO PALOMA & CIA");
       printf ("\n\n(E)mpilhar Sapato\n");
       printf ("(L)istar Estoque Sapatos\n");
       printf ("(D)esempilhar Sapato\n");
       printf ("(S)air do Programa\n\n");
       
       printf ("Digite a opcao: ");
       
       op=toupper(getche());
       
       switch(op){
                  case'E': push_sapato();
                  break;
                  case'L': listar_sapatos();
                  break;
                  case'D': pop_sapato();
                  break;
                  case'S': exit(0);
                  default: printf ("\n\nOpcao invalida, digite novamente.\n\n");
                  }       
                  system("PAUSE");
                  }while (op!='S');
    return (0);
}

8 Respostas

rodrigo_gomes

tente trocar

aux=aux->topo;

por

aux=aux->prox;

[]´s
Rodrigo

paloma

Deu certo, mas se não for pedir demais vc poderia me explicar? :wink: :lol:

rodrigo_gomes

é que na sua struct Sapato vc não tem um campo chamado ‘topo’ que vc tava tentando usar. O nome correto do campo é prox.

typedef struct Sapato{
         char marca[MAX];
         char modelo[MAX];
         char cor[MAX];
         int num;
         struct Sapato *prox;
         };

[]´s
Rodrigo

paloma

Mas eu declarei um ponteiro topo pra struct Sapato nas variáveis globais, não é a mesma coisa?

rodrigo_gomes

não, topo é uma variavel do tipo Satapo, assim como aux.
ela não é uma propriedade de sapato, ou seja, não faz parte da estrutura

paloma

Há tá, agora entendi :lol: :wink:

Rodrigo_Carlos_de_So

Cara show de bola msm esse programa,mais como o amigo disse tem q trocar aux=aux->topo;,por aux=aux->prox; senão ñ ira compilar…testei no Dev-C++ ficou legal…bom pra quem ta aprendendo a programar em C

abraço a todos

bliberali

Vocês não fazem idéia de COMO esse código me ajudou!!!

Parabéns pela postagem!!!

:wink:

Criado 3 de junho de 2006
Ultima resposta 10 de jun. de 2010
Respostas 8
Participantes 4