Logo Hardware.com.br
palominha
palominha Membro Senior Registrado
246 Mensagens 0 Curtidas

PIlhas em C

#1 Por palominha 31/05/2006 - 16:39
Alguém pode ver qual o problema com esse código?

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

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

//VARIÁVEIS GLOBAIS
char marca[MAX], modelo[MAX], cor[MAX];
int num;

//FUNÇÃO AUXILIAR LER DADOS PILHA
void ler_dados()
{
system ("cls&quot;

printf ("\n\nEntre com a marca do sapato: &quot;
fflush (stdin);
fgets (marca,MAX,stdin);

printf ("Entre com o modelo do sapato: &quot;
fflush (stdin);
fgets (modelo,MAX,stdin);

printf ("Entre com a cor do sapato: &quot;
fflush (stdin);
fgets (cor,MAX,stdin);

printf ("Entre com a numeracao do sapato: &quot;
fflush (stdin);
scanf ("%d", &num);
}

//FUNÇÃO INSERIR DADOS
void pilha_push(TSapato **topo)
{
TSapato *ptr;
ler_dados();//chamando a função

ptr=(TSapato*)malloc(sizeof(TSapato));
strcpy(ptr->marca,marca);
strcpy(ptr->modelo,modelo);
strcpy(ptr->cor,cor);
ptr->num=num;
ptr->prox=NULL;

if(*topo==NULL)
*topo=ptr;

else{
ptr->prox=*topo;
*topo=ptr;
}
}

//FUNÇÃO EXCLUIR DADOS
/*void pilha_pop(TSapato **topo)
{
TSapato *aux;

if(*topo==NULL)
printf ("ERRO: Pilha Vazia.\n&quot;

else{
aux=*topo;
*topo=*topo->prox;
free(aux);
}
}*/

//FUNÇÃO LISTAR DADOS
void pilha_listar(TSapato **topo)
{
TSapato *aux;

aux=*topo;

while(aux!=NULL){
printf ("Marca do Sapato: %s",aux->marca);
printf ("Modelo do Sapato: %s",aux->modelo);
printf ("Cor do Sapato: %s",aux->cor);
printf ("Numero do Sapato: %d",aux->num);
aux=aux->*topo; //ERRO: `topo' cannot be used as a member pointer, since it is of type `TSapato**'
}
}

//FUNÇÃO PRINCIPAL
int main()
{
char op;
TSapato *topo=NULL;

do{
system ("cls&quot;
printf ("\t\t\tFABRICA DE SAPATOS\n\n&quot;
printf ("(I)ncluir dados sapato.\n&quot;
printf ("(E)xcluir dados sapato.\n&quot;
printf ("(L)istar dados sapato.\n&quot;
printf ("(S)air do programa.\n&quot;

printf ("\nDigite a opcao: &quot;

op=toupper(getche());

switch(op){
case 'I': pilha_push(&topo);
break;
/* case 'E': pilha_pop (&topo);
break;*/
case 'L': pilha_listar(&topo);
break;
case 'S': exit(0);
default: printf ("\n\nOpcao invalida, digite novamente.\n\n&quot;
}
system ("PAUSE&quot;
}while (op!='S');
return (0);
}
Responder
jqueiroz
jqueiroz Cyber Highlander Registrado
104K Mensagens 5.7K Curtidas
#2 Por jqueiroz
31/05/2006 - 19:18
aux=aux->*topo; //ERRO: `topo' cannot be used as a member pointer, since it is of type `TSapato**'


palominha, vou colocar essa na conta da desatenção... :lol:

Veja só: você tem a sua struct Sapato, que tem os campos "marca", "modelo", "cor", "num" e "prox". Tem algum campo "*topo" nessa struct??? Como você quer usar um campo com esse nome, então???

Você está fazendo uma instrução "aux = (alguma coisa)"; se "aux" é do tipo *TSapato, então essa "alguma coisa" tem que ser desse mesmo tipo, certo? Então vamos ver o que você está tentando fazer: pegar um campo do nó apontado por "aux". E desses campos, qual é do tipo *TSapato??? wink.png
"chmod 777 nunca ajudou ninguém" (c) 2002-2021 JQueiroz/FGdH
Conheça o Blog do Zekke
jqueiroz
jqueiroz Cyber Highlander Registrado
104K Mensagens 5.7K Curtidas
#4 Por jqueiroz
01/06/2006 - 14:01
Mas não é campo da estrutura... quais são os campos dessa estrutura?

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


Taí: são "marca", "modelo", "cor", "num" e "prox". Então quando você usar "variavel->xxxxx", esse xxxxx tem que ser um desses campos... o operador "->" serve pra isso, pra você indicar que quer pegar um campo de uma estrutura.
"chmod 777 nunca ajudou ninguém" (c) 2002-2021 JQueiroz/FGdH
Conheça o Blog do Zekke
jqueiroz
jqueiroz Cyber Highlander Registrado
104K Mensagens 5.7K Curtidas
#6 Por jqueiroz
01/06/2006 - 19:46
Então olha só: digamos que você tem duas variáveis declaradas assim:

TSapato *ponteiro1, *ponteiro2;


E que lá pelas tantas, eu tenho no meio do meu código uma linha assim:

ponteiro1 = ponteiro2->xxxxxxx;


Ou seja, eu quero que "ponteiro1", que é do tipo (TSapato *), receba o valor de um dos campos da estrutura para onde "ponteiro2" está apontando.

Eu pergunto, qual desses campos é compatível com essa atribuição, ou seja, qual dos campos dentro da struct Sapato tem o mesmo tipo que o que eu quero, que é (TSapato *)?
"chmod 777 nunca ajudou ninguém" (c) 2002-2021 JQueiroz/FGdH
Conheça o Blog do Zekke
jqueiroz
jqueiroz Cyber Highlander Registrado
104K Mensagens 5.7K Curtidas
#8 Por jqueiroz
02/06/2006 - 03:00
Vamos tentar de outra forma?

Veja esta figura, ela representa a sua pilha.
bcdc0788df6eec255cb3c22b1d6860ad

Veja que há uma variável "topo" que aponta pro primeiro nó, e cada nó tem um campo "prox" que aponta pro próximo. Só o último é diferente, pois aponta para NULL.

Como eu faço para ver o que tem nessa pilha? Eu faço um "percurso" nela:
918bdd2dff460fb5f3cc62e51aed1f06

Agora vamos inserir um novo nó na pilha:
747301d4c196a74a9183e5c0a4cbc882

Acho que deu uma clareada, agora, né? Você precisa entender bem alguns conceitos pra gente poder avançar as explicações.
"chmod 777 nunca ajudou ninguém" (c) 2002-2021 JQueiroz/FGdH
Conheça o Blog do Zekke
Responder Tópico
© 1999-2024 Hardware.com.br. Todos os direitos reservados.
Imagem do Modal