簡體   English   中英

選擇排序與鏈表C

[英]Selection Sort with Linked List 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;
        }
}

我想如何在指針之間進行交換,請幫助我。

Att

請注意我對這個問題的評論,但排序功能的主要問題似乎是您從未執行任何實際交換。 我想這段代碼是為了進行交換...

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

...但是它只是交換跟蹤變量的值,而不交換列表中指向節點的位置。 您需要調整struct Candidato對象的proximo指針以交換列表元素。 這有點棘手,尤其是對於像您這樣的單鏈接列表。

此外,用鏈表,你並不真的需要換本身 在每一步中,只需從其在子列表中的當前位置中刪除最小元素,然后將其重新插入子列表的開頭即可。 實際上,這將比真正的互換要容易得多。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM