Jump to content
Fórum Script Brasil
  • 0

Lista encadeada - estrutura passada a um vetor


Inu

Question

(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

Edited by Inu
Link to comment
Share on other sites

3 answers to this question

Recommended Posts

  • 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''..

Edited by Inu
Link to comment
Share on other 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 to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152.2k
    • Total Posts
      652k
×
×
  • Create New...