2015-11-19 2 views
0

Im try order my Linked List по выбору сортировки, но у меня есть проблема с заменой между указателем наследующим и следующим (proximo), моя функция ordena dont work. Как я это делаю?Выбор Сортировка со связанным списком C

#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; 
     } 
} 

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

Att

+0

Если это должно быть C, вам не хватает некоторых деклараций. Что такое тип 'TipoListaCandidato', например? В C наличие структуры с этим * тегом * автоматически не дает вам тип с этим * именем *. –

+0

Это выглядит подозрительно: 'if (seguinte-> nota> minimo-> nota) {minimo = seguinte; } '. Мой испанский (португальский?) Не очень хорош, но если «minimo» должен заканчиваться как указатель на наименьший элемент в текущем подсписке, то у вас есть сравнение назад, –

ответ

0

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

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

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

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

Смежные вопросы