Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Sign in to follow this  
gsilvap

Ordenar listas ligadas

Recommended Posts

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

Share this post


Link to post
Share on other 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!

Share this post


Link to post
Share on other 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!

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.