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

Lista encadeada - estrutura passada a um vetor


Inu

Pergunta

(receber caracteres do usuario e retornar primeiro as letras depois os dígitos na seguinte ordem:

A34RGF -> ARGF43

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

/*estabelecendo estrutura para receber um caractere*/
struct lista
{
       char caractere;
       struct lista *prox;
};
typedef struct lista list;
/*função para inserir uma nova estrutura na lista*/
list *insere(list *L,char c)
{
      list*novo=(list*) malloc(sizeof(list));
      novo-> caractere = c;
      novo-> prox = L;
      return novo;
}
/*função para fazer a ordenação de caracteres utilizando um vetor*/
list *ordenar(list *L)
{
      list *p;
      int cont_dig, cont_caract;
      int i=0,j=0;
      for(list *p= L; p!=NULL; p= p->prox)
      {
          if(isdigit(p->caractere))
               cont_dig++;
          else
              cont_caract++;
      }
      char *vetor=(char*) malloc(cont_dig*sizeof(char)); /*Alocando espaço na memoria para o vetor de digitos*/
      char *vetor2=(char*) malloc(cont_caract*sizeof(char)); /*Alocando espaço na memoria para vetor de caracteres*/
      for(list *p= L; p!=NULL;p= p->prox)
      {
          if(isdigit(p->caractere))
          {      
                 vetor[i]= p->caractere;
                 i++;
          }
          else
          {
                 vetor2[j]= p->caractere;
                 j++;
          }
      }
      vetor[i] = '';
      vetor2[j] = '';
      list *organizado;
      organizado = NULL;
      for(i=j-1;i>=0;i--)
      {
                 organizado=insere(organizado,vetor[i]);
      }
      for(i=0;i<j;i++)
      {
                 organizado=insere(organizado,vetor2[j]);
      }
      return organizado;      
}


/*função para imprimir*/
void imprime(list *L)
{
     list *p = L;
     while(p!= NULL)
     {
               printf("%c",p->caractere);
               p= p->prox;
     }
}

main()
{
      char caractere_user;
      int valor=0;
      list*L;
      L=NULL;
      switch(valor)
      {
          case 0 : 
          {
                   printf("Digite um caractere\n");
                   scanf("%c", caractere_user);
                   fflush(stdin);
                   L=insere(L , caractere_user);
                   printf("Voce deseja digitar outro caractere?\n(0=SIM)(1=não)");
                   scanf("%d",valor);
                   fflush(stdin);
          }
          case 1 : 
          {
                   printf("Voce optou por não digitar mais caracteres\n");
                   break;
          }
          default: 
          {
                   printf("Valor inexistente\nERRO\n");
                   exit(0);
          }
      }
      L= ordenar(L);
      imprime(L);
      system("pause");
}

Galera não tá compilando, e eu não consigo achar o erro! Passa pelo run, porém dá erro durante o .exe

Alguém poderia me ajudar? Vlw

Editado por Inu
Link para o comentário
Compartilhar em outros sites

3 respostass a esta questão

Posts Recomendados

  • 0

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

/*estabelecendo estrutura para receber um caractere*/
struct lista
{
       char caractere;
       struct lista *prox;
};
typedef struct lista list;
/*função para inserir uma nova estrutura na lista*/
list *insere(list *L,char c)
{
      list*novo=(list*) malloc(sizeof(list));
      novo-> caractere = c;
      novo-> prox = L;
      return novo;
}
/*função para fazer a ordenação de caracteres utilizando um vetor*/
list *ordenar(list *L)
{
      list *p;
      int cont_dig, cont_caract;
      int i=0,j=0;
      for(list *p= L; p!=NULL; p= p->prox)
      {
          if(isdigit(p->caractere))
               cont_dig++;
          else
              cont_caract++;
      }
      char *vetor=(char*) malloc(cont_dig*sizeof(char)); /*Alocando espaço na memoria para o vetor de digitos*/
      char *vetor2=(char*) malloc(cont_caract*sizeof(char)); /*Alocando espaço na memoria para vetor de caracteres*/
      for(list *p= L; p!=NULL;p= p->prox)
      {
          if(isdigit(p->caractere))
          {      
                 vetor[i]= p->caractere;
                 i++;
          }
          else
          {
                 vetor2[j]= p->caractere;
                 j++;
          }
      }
      vetor[i] = '';
      vetor2[j] = '';
      list *organizado;
      organizado = NULL;
      for(i=j-1;i>=0;i--)
      {
                 organizado=insere(organizado,vetor[i]);
      }
      for(i=0;i<j;i++)
      {
                 organizado=insere(organizado,vetor2[j]);
      }
      return organizado;      
}


/*função para imprimir*/
void imprime(list *L)
{
     list *p = L;
     while(p!= NULL)
     {
               printf("%c",p->caractere);
               p= p->prox;
     }
}

main()
{
      char caractere_user;
      int i,numero_caract;
      list*L;
      L=NULL;
      printf("Digite o numero de caracteres que voce deseja ordenar\n");
      scanf("%d", &numero_caract);
      for(i=0;i<=numero_caract;i++)
      {
           printf("Digite um caractere\n");
           scanf("%c", &caractere_user);
           fflush(stdin);
           L=insere(L , caractere_user);
           fflush(stdin);
      }
      L= ordenar(L);
      imprime(L);
      system("pause");
}

Vlw!

Agora já da pra entrar os caracteres, porém mais a frente o mesmo erro persiste, da a mensagem ''o programa parou de funcionar''..

Editado por Inu
Link para o comentário
Compartilhar em outros sites

  • 0

Boa tarde!

Seguem minhas considerações:

1) Dentro do for na função de ordenar você está declarando list *p. Mas ele já havia sido declarado no início da função! Use apenas "p=L" no for.

2) Não precisa carregar o zero no final dos vetores já que você não vai exibir a string em um printf, por exemplo.

3) O loop para criação da nova lista ordenada está com os contadores incorretos. Apenas crie uma nova variável e incremente-a até i ou j.

4) Sempre que usar o scanf podem sobrar caracteres não utilizados no buffer como a quebra de linha. O fflush(stdin) é errado e não deve ser usado! Uma forma simples de descartar o \n é como a seguir:

scanf("%d", &valor); // O \n fica no buffer
scanf("%d%*c", &valor); // um caracter após o final é lido e descartado. \n é removido! Use desta forma
5) O loop que carrega os caracteres pede 1 a mais do que deveria. O correto é usar o operador "<" e não "<=" na comparação 6) Lembre-se sempre de adicionar uma quebra de linha após exibir um texto. A saída da função imprime não tem a quebra e embaralha com a mensagem do comando "pause" (que por sinal dá erro aqui pois uso o linux, evite usar a função system!) Segue abaixo o código completo já funcionando:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<ctype.h>

/*estabelecendo estrutura para receber um caractere*/
struct lista
{
       char caractere;
       struct lista *prox;
};
typedef struct lista list;
/*função para inserir uma nova estrutura na lista*/
list *insere(list *L,char c)
{
      list*novo=(list*) malloc(sizeof(list));
      novo-> caractere = c;
      novo-> prox = L;
      return novo;
}
/*função para fazer a ordenação de caracteres utilizando um vetor*/
list *ordenar(list *L)
{
      list *p;
      int cont_dig, cont_caract, cont;
      int i=0,j=0;
      for(p= L; p!=NULL; p= p->prox)
      {
          if(isdigit(p->caractere))
               cont_dig++;
          else
              cont_caract++;
      }
      char *vetor=(char*) malloc(cont_dig*sizeof(char)); /*Alocando espaço na memoria para o vetor de digitos*/
      char *vetor2=(char*) malloc(cont_caract*sizeof(char)); /*Alocando espaço na memoria para vetor de caracteres*/
      for(p= L; p!=NULL;p= p->prox)
      {
          if(isdigit(p->caractere))
          {      
                 vetor[i]= p->caractere;
                 i++;
          }
          else
          {
                 vetor2[j]= p->caractere;
                 j++;
          }
      }
      list *organizado;
      organizado = NULL;
      for(cont=0;cont<i; cont++)
      {
                 organizado=insere(organizado,vetor[cont]);
      }
      for(cont=0;cont<j; cont++)
      {
                 organizado=insere(organizado,vetor2[cont]);
      }
      return organizado;      
}


/*função para imprimir*/
void imprime(list *L)
{
     list *p = L;
     while(p!= NULL)
     {
               printf("%c",p->caractere);
               p= p->prox;
     }
}

main()
{
      char caractere_user;
      int i,numero_caract;
      list*L;
      L=NULL;
      printf("Digite o numero de caracteres que voce deseja ordenar\n");
      scanf("%d%*c", &numero_caract);
      for(i=0;i<numero_caract;i++)
      {
           printf("Digite um caractere\n");
           scanf("%c%*c", &caractere_user);
           fflush(stdin);
           L=insere(L , caractere_user);
           fflush(stdin);
      }
      L= ordenar(L);
      imprime(L);
      printf("\n");
      system("pause");
}

Abraços,

Marcelo Utikawa da Fonseca

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,3k
×
×
  • Criar Novo...