Сортировка выбором со связанным списком C

Я пытаюсь упорядочить свой связанный список по сортировке выбором, но у меня проблема с переключением между указателем 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;
        }
}

Я хотел бы, как я могу поменять местами указатели, помогите мне, пожалуйста.

Атт


person Felipe Palma    schedule 19.11.2015    source источник
comment
Если это должно быть C, то вам не хватает некоторых объявлений. Что такое тип TipoListaCandidato, например? В C наличие структуры с этим тегом автоматически не дает вам тип с этим именем.   -  person John Bollinger    schedule 19.11.2015
comment
Это выглядит подозрительно: if(seguinte->nota > minimo->nota){ minimo = seguinte; }. Мой испанский (португальский?) не так хорош, но если minimo должен быть указателем на наименьший элемент в текущем подсписке, тогда у вас есть сравнение в обратном порядке,   -  person John Bollinger    schedule 19.11.2015


Ответы (1)


Обратите внимание на мои комментарии к вопросу, но основная проблема с вашей функцией сортировки заключается в том, что вы никогда не выполняете никаких реальных обменов. Я предполагаю, что этот код предназначен для замены...

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

... но он просто меняет значения ваших переменных отслеживания, а не позиции указанных узлов в вашем списке. Вам нужно настроить указатели proximo ваших struct Candidato объектов, чтобы поменять местами элементы списка. Это немного сложно, особенно с односвязным списком, таким как ваш.

Кроме того, со связанным списком вам не нужно менять местами само по себе. На каждом шаге просто удаляйте минимальный элемент из его текущей позиции в подсписке и повторно вставляйте его в начало подсписка. На самом деле это будет намного проще, чем добросовестный обмен.

person John Bollinger    schedule 19.11.2015