Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

gsilvap

Ordenar listas ligadas

Mensagens Recomendadas

gsilvap

Boas....

Estou com problemas numa função para ordenar listas ligadas por preço....

void ordena_lista_preco(Lista lista_eventos)
{
    Lista actual = lista_eventos->proximo;
    Lista ant = lista_eventos;
    int tamanho = tamanho_lista(lista_eventos);
    int trocas = 0; // contabilizar as trocas de elementos na lista
    int i, j;


    for(i = tamanho; i > 1; i--)
    {

        for(j = 1; j < i; j++)
        {
            if(compara_precos(actual->info, actual->proximo->info))
            {
                ant->proximo = actual->proximo;
                actual->proximo = actual->proximo->proximo;
                ant->proximo->proximo = actual;

                trocas++;
            }
        }
        if( trocas == 0)
            break;

        actual = lista_eventos->proximo;
        ant = lista_eventos;
        trocas = 0;
    }

}

A funçao compara lista devolve 0 se actual->info<actual->proximo->info, caso contrario devolve 1...

Se a minha lista de eventos tiver so dois elementos, funciona, mas se tiver mais já não funciona, não percebo o que estou a fazer de errado, alguem me pode ajudar??

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
miguel4

boas

tu estás a trabalhar com listas não com vectores ...

for(j = 1; j < i; j++)

        {

            if(compara_precos(actual->info, actual->proximo->info))

provavelmente aqui não estás a mudar as posições da lista visto que apesar da quantidade de vezes que tu repetes o for apenas comparas os dois primeiros nós da lista .... não estás a mexer nos nós que estás a comparar no if a não ser que entres nele.

cumps.


keep it simple!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
miguel4

olha estou um pouco enferujado a trabalhar com listas xD

mas eu fazia antes com um algoritmo desde género apesar de muito lento

void ordena_lista_preco(Lista lista_eventos){
Lista aux=lista_eventos;
int trocas;

do{
trocas=0;
while(aux->proximo!=NULL){
	if( (aux->info) > (aux->proximo->info) ){
		swap(lista_eventos,aux); // troca o nó aux na lista  com o nó seguinte
		trocas++;
	}
	aux=aux->proximo;
}
aux=lista_eventos;
}
while(trocas!=0);
}

void swap(Lista list,Lista x){
Lista aux=list,auxtroca;

while(aux!=NULL){
	if(aux->proximo==x){
		auxtroca=x->proximo;
		x->proximo=x->proximo->proximo;
		aux->proximo=auxtroca;
		aux->proximo->proximo=x;
		break;
	}
}
}

desculpa senão funcionar mas sei que pelo menos essa lógica simplifica o problema.

cumps.

PS: não testei o programa


keep it simple!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.