Ir ao conteúdo
  • Cadastre-se

C linguagem c ordenacao crescente


Tatiane
Ir à solução Resolvido por arfneto,

Posts recomendados

Boa tarde preciso implementar em linguagem C a função de ordenação crescente da lista e não estou conseguindo. Alguém poderia me auxiliar

 

#include <stdio.h>

#include <stdlib.h>

#include <locale.h>

 

typedef struct BLOCO{

int dado;

struct BLOCO *prox;

}BLOCO;

 

typedef struct LISTA{

BLOCO *start;

BLOCO *end;

}LISTA;


 

void startLISTA(LISTA *l){

l->start = NULL;

l->end = NULL;

}

 

void insereLista_cabeca(int dado, LISTA *l){

BLOCO *ptr_aux = (BLOCO*)malloc(sizeof(BLOCO));

 

if (ptr_aux == NULL){

printf("Memory Allocation Error");

exit(-1);

}

else{

ptr_aux->dado = dado;

ptr_aux->prox = NULL;

 

if(l->start == NULL){

l->start = ptr_aux;

l->end = ptr_aux;

}

else{

ptr_aux->prox = l->start;

l->start = ptr_aux;

}

}

}

 

void insereLista_cauda(int dado, LISTA *l){

BLOCO *ptr_aux = (BLOCO*)malloc(sizeof(BLOCO));

 

if (ptr_aux == NULL){

printf("Memory Allocation Error");

exit(-1);

}

else{

ptr_aux->dado = dado;

ptr_aux->prox = NULL;

 

if(l->start == NULL){

l->start = ptr_aux;

l->end = ptr_aux;

}

else{

l->end->prox = ptr_aux;

//ptr_aux->prox = NULL;

l->end = ptr_aux;

}

}

}

 

int removeLista_cabeca(LISTA *l){

BLOCO *ptr_aux = l->start;

int dado;

 

if(ptr_aux != NULL){

l->start = ptr_aux->prox;

ptr_aux->prox = NULL;

dado = ptr_aux->dado;

free(ptr_aux);

if(l->start == NULL){

l->end = NULL;

}

return dado;

}

else{

printf("LIST is Empty \n");

}

return dado;

}


 

int removeLista_cauda(LISTA *l){

BLOCO *ptr_aux_ant;

BLOCO *ptr_aux = l->start;

int dado;

 

if(ptr_aux != NULL){

while (ptr_aux->prox != NULL){

ptr_aux_ant = ptr_aux;

ptr_aux = ptr_aux->prox;

}

l->end = ptr_aux_ant;

ptr_aux_ant->prox = NULL;

//l->start = ptr_aux->prox;

//ptr_aux->prox = NULL;

dado = ptr_aux->dado;

free(ptr_aux);

if(l->start == NULL){

l->end = NULL;

}

return dado;

}

else{

printf("LIST is Empty \n");

}

return dado;

}


 

int removeLista_elemento(int dado, LISTA *l){

BLOCO *ptr_aux_ant = l->start;

BLOCO *ptr_aux = l->start;

if(ptr_aux != NULL){

while (ptr_aux->prox != NULL){

if (ptr_aux->dado == dado){

if (ptr_aux_ant == ptr_aux){

removeLista_cabeca(l);

}

else{

ptr_aux_ant->prox = ptr_aux->prox;

ptr_aux->prox = NULL;

return ptr_aux->dado;

free(ptr_aux);

}

}

ptr_aux_ant = ptr_aux;

ptr_aux = ptr_aux->prox;

}

if (ptr_aux->prox == NULL){

removeLista_cauda(l);

}

//l->end = ptr;

//ptr->prox = NULL;

//l->start = ptr_aux->prox;

//ptr_aux->prox = NULL;

//dado = ptr_aux->dado;

//free(ptr_aux);

if(l->start == NULL){

l->end = NULL;

}

return dado;

}

else{

printf("LIST is Empty \n");

}

return dado;

}


 

void printLISTA(LISTA *l){

BLOCO *ptr_print = l->start;

 

if(ptr_print != NULL){

while (ptr_print != NULL){

printf("%d ", ptr_print->dado);

ptr_print = ptr_print->prox;

}

}

else{

printf("LISTA is Empty");

return;

}

printf("\n");

}

 

int main(){

 

LISTA *li = (LISTA*) malloc(sizeof(LISTA));

if (li == NULL){

printf("Memory Allocation Error");

exit(-1);

}

else{

startLISTA(li);

 

insereLista_cabeca(1, li);

 

printLISTA(li);

 

insereLista_cabeca(12, li);

 

printLISTA(li);

 

insereLista_cabeca(15, li);

 

printLISTA(li);

 

insereLista_cauda(20, li);

 

printLISTA(li);

 

insereLista_cauda(25, li);

 

printLISTA(li);

 

removeLista_cabeca(li);

 

printLISTA(li);

 

removeLista_cabeca(li);

 

printLISTA(li);

 

//removeLista_cauda(li);

 

//printLISTA(li);

 

//removeLista_cabeca(li);

 

removeLista_elemento(20, li);

 

printLISTA(li);

 

removeLista_elemento(25, li);

 

printLISTA(li);
 

}

 

}

Link para o comentário
Compartilhar em outros sites

Alguém pediu especificamente pra você criar um algorítimo de ordenação pra uma Linked List? A ideia de uma Linked List é a facilidade de se inserir os itens já em ordem.

 

Vou olhando o código por enquanto, mas uma coisa que já noto é mais de um return statement sem que haja necessidade (quando possível, use apenas um return por função).

 

Edit: Vejo também a declaração de variáveis sem sua imediata inicialização. Não é boa ideia. Sempre inicialize uma variável em sua declaração.

 

Exemplo:

 

int dado = 0; //ou outro valor.

BLOCO* ptr_aux = NULL;

Link para o comentário
Compartilhar em outros sites

A Linked List geralmente expõe como interface apenas a função "inserir elemento", e o elemento é inserido já no lugar certo, em ordem. Ou seja, para inserir o elemento, você percorre a lista, quando acha um elemento  já na lista que seja maior do que o elemento que você está inserindo, você insere o elemento imediatamente antes deste.

 

Como tenho meu C puro meio enferrujado, vou resumir o código. Teste pra ver se funciona, estou sem acesso a um compilador no momento (retorna o indice em que o elemento foi inserido):

 

int inserir_elemento(LISTA* lista, int dado)
{
  BLOCO* novo_elemento = NULL;
  //TODO: alocacao
  
  //TODO: checa se a lista esta vazia, se estiver, insere o item na cabeça/cauda da lista
  
  int idx = 0;
  BLOCO* ptr_iterador = lista->head;
  BLOCO* ptr_trailing = ptr_iterador;//aponta pro elemento anterior.
  
  while(ptr_iterador && ptr_iterador->dado <= dado)
  {
    ptr_trailing = ptr_iterador;
    ptr_iterador = ptr_iterador->prox;
    ++idx;
  }
  
  ptr_trailing->prox = novo_elemento;
  //faltou no original a linha abaixo
  novo_elemento->prox = ptr_iterador;
  return idx;
}

 

Link para o comentário
Compartilhar em outros sites

@Tatiane Sim, isso mesmo. Geralmente se usa head e tail pra cabeça e cauda da linked list, respectivamente, e eu acabei me confundindo. Veja também a linha que acrescentei, que incorpora o novo elemento à lista fazendo seu ponteiro prox apontar pro bloco com dado imediatamente maior que o dado dele. Faz tempo que não escrevo esse tipo de código manualmente, bibliotecas têm os containers prontos (em C++ e C#, são parte da linguagem). Cheque pra ver se não tem alguma falha aí.

Link para o comentário
Compartilhar em outros sites

  • Solução

Se vai ordenar a lista in-place, ordenando a própria lista e não retornando outra ordenada, talvez seja melhor simplesmente modificar insere() e já inserir na ordem. Afinal se depois de classificar usar uma de suas outras funções de inserção vai zoar a classificação de todo modo e a única maneira de garantir que vai estar em ordem é classificar toda hora...

 

Sobre a classificação o simples é uma função de comparação entre dois nós. No seu caso o dado é um simples número.

 

É provavelmente melhor usar um ponteiro no nó e não o dado. Assim pode ter mais listas apontando para os mesmos dados, por exemplo.

 

Evite retornar void. Em geral é um desperdício. Muitas vezes um erro mesmo. USe parâmetros e retorne resultados. Por exemplo, criar lista deveria retornar o endereço de uma lista. 

 

    LISTA* li = (LISTA*)malloc(sizeof(LISTA));
    if (li == NULL)
    {
        printf("Memory Allocation Error");
        exit(-1);
    }
    else
    {
        startLISTA(li);

 

por exemplo estaria bem melhor como

 

    LISTA* li = startLISTA();

 

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

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!