我尝试通过选择排序来命令我的链接列表,但我在指针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
答案 0 :(得分:0)
请注意我对该问题的评论,但排序功能的主要问题似乎是您没有执行任何实际的交换。我想这段代码意味着进行交换......
tmp = aux;
aux = minimo;
minimo = tmp;
...但它只是交换跟踪变量的值,而不是列表中指向节点的位置。您需要调整proximo
对象的struct Candidato
指针以交换列表元素。这有点棘手,特别是对于像你这样的单链表。
此外,使用链接列表,您实际上不需要交换本身。在每个步骤中,只需从子列表中的当前位置移除最小元素,然后将其重新插入子列表的开头。这实际上比真正的交换更容易管理。