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

Ordenar Elementos Crescentemente em Lista encadeada


Micael Pimentel

Pergunta

Olá galera, tudo bem, espero está fazendo esse tópico corretamente pois sou novo aqui...

Enfim, é o seguinte, estou com um problema no meu código em C que consiste em inserir elementos numa lista encadeada, mas os elementos que são inseridos devem ser posicionados na lista em ordem crescente. Por exemplo, eu insiro 10, depois insiro 20 e depois insiro 16, e a lista deve ficar assim: 10, 16, 20. Entenderam?

Bem até aí tudo bem, meu código está funcionando, mas o problema é quando eu vou inserir outro elemento menor que o primeiro da lista. Aproveitando o exemplo acima, se eu for inserir o 7 nessa lista, meu código não funciona como eu esperaria. Aí é nessa parte que eu estou com problemas.

Aqui a função que fiz para inserir, o parêmetro dela é a cabeça da lista na qual quero inserir os elementos:

void inserir(lista **p){
    lista *atual, *novo, *anterior;
    int num;
    
    novo = (lista *) malloc(sizeof(lista));

    atual = *p;
    anterior = NULL;
    
    printf("Insira um valor: ");
    scanf("%d", &num);
    
    novo->valor = num;
    
    if(atual == NULL){
        novo->prox = NULL;
        *p = novo;
    } else{
        while(atual != NULL && atual->valor < num){
            anterior = atual;
            atual = atual->prox;
        }
        
        novo->prox = atual;
        
        if(anterior == NULL){
            *p = novo;
        } else{
            anterior->prox = novo;
        }
    }
}

Então, creio que o problema esteja nessas últimas linhas da função, deve haver alguma coisa muito muito errada acontecendo aí e eu não consigo notar. Qualquer ajuda será bem vinda, abraços.

Link para o comentário
Compartilhar em outros sites

2 respostass a esta questão

Posts Recomendados

  • 0

Seu código está funcionando corretamente.

Pra testar, montei uma estrutura, uma função pra mostrar os números da lista e usei a sua função, sem alterar.

Segue:

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

typedef struct tLista
{
    int valor;
    struct tLista *prox;

} lista;

void inserir(lista **p)
{
    lista *atual, *novo, *anterior;
    int num;

    novo = (lista *) malloc(sizeof(lista));

    atual = *p;
    anterior = NULL;

    printf("Insira um valor: ");
    scanf("%d", &num);

    novo->valor = num;

    if(atual == NULL){
        novo->prox = NULL;
        *p = novo;
    } else{
        while(atual != NULL && atual->valor < num){
            anterior = atual;
            atual = atual->prox;
        }

        novo->prox = atual;

        if(anterior == NULL){
            *p = novo;
        } else{
            anterior->prox = novo;
        }
    }
}

void mostraLista(lista *p)
{
    while(p != NULL)
    {
        printf("Valor: %d\n", p->valor);
        p = p->prox;
    }
}

int main(void)
{

    lista *inicio = NULL;
    char opcao = 's';

    while( opcao == 's' || opcao == 'S' )
    {
        inserir(&inicio);

        printf("Deseja inserir outro? (S/N)\n");
        scanf(" %c", &opcao);
    }

    mostraLista(inicio);

    return 0;
}

Depois de inserir os valores 10, 20, 16 e 7, a função "mostraLista()", mostrou a ordem correta.

Link para o comentário
Compartilhar em outros sites

  • 0
Seu código está funcionando corretamente.

Pra testar, montei uma estrutura, uma função pra mostrar os números da lista e usei a sua função, sem alterar.

Depois de inserir os valores 10, 20, 16 e 7, a função "mostraLista()", mostrou a ordem correta.

Puxa vida, então acho que dever ser algum problema na execução no meu computador ou compilador eu acho. Em casa uso o MinGW no Windows, contudo fui rodar esse mesmo código na faculdade e funcionou normal também. Obrigado pela resposta. :D

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.1k
    • Posts
      651.8k
×
×
  • Criar Novo...