选择按链接列表C排序

时间:2015-11-19 14:27:50

标签: c pointers data-structures selection-sort

我尝试通过选择排序来命令我的链接列表,但我在指针atual和next(proximo)之间的交换有问题,我的函数 ordena 不起作用。我是怎么做到的?

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


struct Candidato{
    int nota;
    char nome[200];
    char cpf[11];
    struct Candidato *proximo;

};

struct TipoListaCandidato{
    Candidato *inicio = NULL;
    Candidato *fim = NULL;
};

void iniciaCandidato(TipoListaCandidato *pLista){
    pLista->inicio = NULL;
    pLista->fim = NULL;
} 

TipoListaCandidato lista;

void inserirCandidato(TipoListaCandidato *pLista){
    int nota;
    char nome[200],cpf[11];

    Candidato *aux = pLista->inicio;

    Candidato *novoNodo = new Candidato;


    printf("Digite nome: ");
    fflush(stdin);
    gets(nome);

    printf("Digite cpf: ");
    fflush(stdin);
    gets(cpf);

    printf("Digite nota: ");
    scanf("%d",&novoNodo->nota);

    strcpy(novoNodo->cpf,cpf);
    strcpy(novoNodo->nome,nome);

    novoNodo->proximo = NULL;

    if(aux == NULL){
        pLista->inicio = novoNodo;
        pLista->fim = novoNodo;

    }else{
        aux = pLista->fim;
        pLista->fim = novoNodo;
        aux->proximo = pLista->fim;
    }
}

TipoListaCandidato ordenado;


void ordena(TipoListaCandidato *pLista){
    Candidato *aux = pLista->inicio,*seguinte,*tmp;
    for(;aux != NULL;aux = aux->proximo){
            Candidato *minimo = aux;
            for(seguinte = aux->proximo;seguinte !=NULL; seguinte = seguinte->proximo){
                if(seguinte->nota > minimo->nota){
                    minimo = seguinte;
                }
            }
            tmp = aux;
            aux = minimo;
            minimo = tmp;
            //tmp->proximo = aux->proximo;
            //minimo->proximo = tmp;
        }
}

我想如何在指针之间进行交换,请帮助我。

Att

1 个答案:

答案 0 :(得分:0)

请注意我对该问题的评论,但排序功能的主要问题似乎是您没有执行任何实际的交换。我想这段代码意味着进行交换......

        tmp = aux;
        aux = minimo;
        minimo = tmp;

...但它只是交换跟踪变量的值,而不是列表中指向节点的位置。您需要调整proximo对象的struct Candidato指针以交换列表元素。这有点棘手,特别是对于像你这样的单链表。

此外,使用链接列表,您实际上不需要交换本身。在每个步骤中,只需从子列表中的当前位置移除最小元素,然后将其重新插入子列表的开头。这实际上比真正的交换更容易管理。