Ir ao conteúdo
  • Cadastre-se

C Lista encadeada - Números em ordem inversa


Posts recomendados

Tenho que fazer uma lista que recebe letras e números e retorne uma lista com as letras na ordem em que foram inseridas e os números na ordem inversa (não decente). No programa que fiz, eu digito primeiro a quantidade de caracteres que quero entrar, depois digito essa quantidade de caracteres (letras e números) e depois o programa para de funcionar. Não sei o que está errado. Por favor, me ajudem!

#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 memória para o vetor de digitos*/
    char *vetor2 = (char*) malloc(cont_caract*sizeof(char)); /*Alocando espaço na memória 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("%s",p->caractere);
        p= p->prox;
    }
}

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

 

Link para o comentário
Compartilhar em outros sites

Pense bem: você precisa de duas listas

 

Escreva em torno dos dados. Sempre. E não comece a escrever antes de ter boa ideia do que vai fazer

 

Entenda que uma lista tem nós. E os nós tem dados. Uma lista não é o nó. O nó não é uma lista. Os dados são um conteúdo. De cada nó.

 

Sempre que programar uma lista como se você um nó e com dados e tudo dentro vai trabalhar muito. A toa. E o resultado não vai compensar.

 

Em uma lista ligada você pode inserir novos elementos no fim ou no começo. Ou em alguma ordem.

 

Em uma lista ligada, ao menos para testar você vai precisar de uma função que lista os caras a partir do início, ou do fim ou de algum ponto.

 

Então se criar uma lista de letras inserindo sempre no fim o que acha que vai acontecer quando listar? As letras vão aparecer na ordem de entrada.

 

E se cria uma lista de números inserindo sempre no começo? Que vai acontecer quando listar? Vão aparecer na ordem inversa. 

 

É só isso. Esse exercício é uma pegadinha. Com senso de humor. 

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...