Ir para conteúdo
Fórum Script Brasil
  • 0

listar strings da pilha


tester

Pergunta

peguei um tuto na net e me basei pra fazer um exercicio da facu mas to com dificuldade

na hora de listar ele não mostra nada !

o que sera ?

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

typedef struct Pilha
{
        char nome[20];
        struct Pilha *embaixo;
}pilha, tElemento;
          
void empilhar(pilha *tElemento)
{
     int numero;   
     
     printf("\nQuantos nomes?: ");
     scanf("%d",&numero);
     
     for(numero;numero>0;numero--)
     {
          tElemento = ((pilha*)malloc(sizeof(pilha)));
          
          printf("Nome: ");
          scanf("%s", tElemento -> nome);
     }                       
}
      
void desempilhar(pilha *tElemento)
{
     pilha *ponteiro;
     int numero;
     
     printf("desempilhar: ");
     scanf("%d",&numero);   
     
     for(numero;numero>0;numero--)
     {
         if(tElemento == NULL)
         {
            ponteiro = tElemento;
            tElemento = tElemento -> embaixo;
             free(ponteiro);          
         }                         
     }                  
}     
       
void listar(pilha *tElemento)
{
 if(tElemento != NULL){
     if(tElemento){
     printf("\nNome: %s\n",tElemento -> nome);                   
     getch();  
     }  
                     }else
      tElemento = tElemento -> embaixo;
      }


void inicializa(pilha **tElemento){
   *tElemento = NULL;
}

int main()
{
 pilha *tElemento;
 int loop;
 loop = 1;
 int menu;
  inicializa(&tElemento);
 while(loop==1){
                printf("\n----MENU----\n");
                printf("1- EMPILHAR: ");
                printf("\n2- DESEMPILHAR: ");
                printf("\n3- LISTAR: ");
                printf("\n4- SAIR: \n");
                printf("\nOPCAO: ");
                scanf("%d",&menu);
                
                switch(menu){
                             case 1:
                                  empilhar(tElemento);
                                  break;
                             case 2:
                                  desempilhar(tElemento);
                                  break;
                             case 3:
                                  listar(&tElemento);
                                  break;
                             case 4:
                                  exit(1);
                                  break;
                             default:
                                     printf("\nopcao inexistente\n \a");     
                             }
                                           
                }    
}

abraços

Link para o comentário
Compartilhar em outros sites

8 respostass a esta questão

Posts Recomendados

  • 0

Vou ver se eu consigo te explicar onde tá o erro. Ele tá aqui nessa função:

void empilhar(pilha *tElemento)
{
     ...
          tElemento = ((pilha*)malloc(sizeof(pilha)));
...

int main()
{
pilha *tElemento;
...
                                  empilhar(tElemento);
...

Você criou um ponteiro em main e passou ele pra empilhar. Lá a variável tElemento recebe uma alocação de memória criada pelo malloc. Mas só que essa alocação não é passada para tElemento de main. Quando a função empilhar acaba a variavel tElemento morre e leva junto a alocação feita lá.

Você tem que alocar primeiro na função main passar tElemento para a função empilhar, e lá fazer as modificações do conteúdo de tElemento. Ai sim elas vão refletir em main. Espero que tenha entendido. qualquer dúvida posta ai. Abraço.

Link para o comentário
Compartilhar em outros sites

  • 0

Uma solução é passar o endereço do ponteiro para a função empilhar e de lá modificar o lugar para o qual o ponteiro aponta (usando ponteiros de ponteiros, meio complexo). Outra solução mais simples (e mais recomendável nesse caso) é fazer com que a função empilhar retorne o endereço que foi alocado.

A função main pode ficar mais ou menos assim:

pilhar*tElemento;
inicializar(tElemento);
...
tElemento=empilhar();
E a função empilhar, assim:
pilha* empilhar(){
...
tElemento = ((pilha*)malloc(sizeof(pilha)));
...
//No fim da função retornamos o novo elemento
return tElemento;
}

Poste aí se funcionou ou não.

Link para o comentário
Compartilhar em outros sites

  • 0

opa vlw jonathan e ronaldo

malz por inxer o saco de vocês '-'

ainda ta dando um erro ronaldo

nossa agora misturei , tinha olhado o outro exemplo. vo ve se ajeito o código aqui.

editando o tópico...

abraços

to usando o código com base no exemplo de jonathan ok

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

typedef struct Pilha
{
        char nome[20];
        struct Pilha *embaixo;
}pilha, tElemento;
          
pilha* empilhar()
{
     int numero;   
     pilha *tElemento;
     printf("\nQuantos nomes?: ");
     scanf("%d",&numero);
     
     for(numero;numero>0;numero--)
     {
          tElemento = ((pilha*)malloc(sizeof(pilha)));
          
          printf("Nome: ");
          scanf("%s", tElemento -> nome);
          return tElemento;
     }                       
}
      
void desempilhar(pilha *tElemento)
{
     pilha *ponteiro;
     int numero;
     
     printf("desempilhar: ");
     scanf("%d",&numero);   
     
     for(numero;numero>0;numero--)
     {
         if(tElemento == NULL)
         {
            ponteiro = tElemento;
            tElemento = tElemento -> embaixo;
             free(ponteiro);          
         }                         
     }                  
}     
       
void listar(pilha *tElemento)
{
if(tElemento != NULL){
     if(tElemento){
     printf("\nNome: %s\n",tElemento -> nome);                   
     getch();  
     }  
                     }else
      tElemento = tElemento -> embaixo;
      }


void inicializa(pilha **tElemento){
   *tElemento = NULL;
}

int main()
{
pilha*tElemento;
inicializa(tElemento);
int loop;
loop = 1;
int menu;
tElemento = empilhar();

while(loop==1){
                printf("\n----MENU----\n");
                printf("1- EMPILHAR: ");
                printf("\n2- DESEMPILHAR: ");
                printf("\n3- LISTAR: ");
                printf("\n4- SAIR: \n");
                printf("\nOPCAO: ");
                scanf("%d",&menu);
                
                switch(menu){
                             case 1:
                                  empilhar(tElemento);
                                  break;
                             case 2:
                                  desempilhar(tElemento);
                                  break;
                             case 3:
                                  listar(&tElemento);
                                  break;
                             case 4:
                                  exit(1);
                                  break;
                             default:
                                     printf("\nopcao inexistenlwte\n \a");     
                             }
                                           
                }    
}

esse assunto de ponteiros pra mim é um saco '-' vo te que aprender isso meu heuhueaha

Editado por Durub
Adicionar tags code [Durub]
Link para o comentário
Compartilhar em outros sites

  • 0
opa vlw jonathan e ronaldo

malz por inxer o saco de vocês '-'

Encher o saco não, fórum é pra isso mesmo: ajudar e ser ajudado.

Mas qual o erro que está ocorrendo? Erro de compilação ou o programa compila e não roda como o esperado?

Se o programa não está rodando como esperado quando se escreve mais de um nome, tente modificar o programa para alocar memória suficiente para todos os nomes de uma só vez (dessa forma, as variáveis serão alocadas de forma linear) e retornar o ponteiro só no final do programa.

O código pode ficar mais ou menos assim:

int numero;  
pilha *tElemento;
printf("\nQuantos nomes?: ");
scanf("%d",&numero);
tElemento=((pilha*)malloc(sizeof pilha*numero)); //se desejar, também pode utilizar a função calloc
for(numero;numero>0;numero--)
{
    printf("Nome: ");
    scanf("%s", tElemento[numero] -> nome);
}
return tElemento; //retorna o elemento
Nota:
tElement[indice] = *(tElemento + indice)

Ponteiros podem ser escrito na forma de arrays e vice-versa.

Link para o comentário
Compartilhar em outros sites

  • 0
opa vlw jonathan e ronaldo

malz por inxer o saco de vocês '-'

Encher o saco não, fórum é pra isso mesmo: ajudar e ser ajudado.

É isso mesmo estamos aqui pra aprender, fique a vontade.

É sempre bom postar a saída do compilador no caso de erro. Vê se a dica do Jonathan dá certo ai e posta o resultado.

Abraço.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...