Я пытаюсь использовать Selection Сортировка, чтобы отсортировать связанный список. Я могу манипулировать указателями связанных списков и не изменять ключи. Я думаю, что у меня есть функциональная логика, но я просто возвращаю исходную несортированную последовательность.Попытка сортировать связанный список только путем манипуляции указателями
bool nodeSwap(Node* head){
Node* next = head->next;
if(next == NULL){ return head;}
head->next = next->next;
next->next = head;
head = next;
return next;
}
Node* sort_list(Node* head){
for(Node* n = head; n->next != NULL; n = n->next){
for(Node* n1 = head->next; n1 != NULL; n1 = n1->next){
if(n-> key > n1->key){
nodeSwap(n);
}
}
}
return head;
}
EDIT
Хорошо, так что я прошел и добавил еще и какая-то логика, которая на самом деле имеет некоторый смысл в этот раз, и у меня есть функция почти работает ... Только проблема в том, что всегда пропускает сортировку по всем первым двум элементам в списке и не возвращается после сортировки. Любые мысли о том, почему это может произойти?
Node* sort_list(Node* head){
Node* curr;
Node* prev;
for(curr = head; curr->next != NULL; curr = curr->next){
if(curr == head){
head = curr->next;
curr->next = head->next;
head->next = curr;
prev = head;
}
else if(curr->key > curr->next->key){
head = curr->next;
curr->next = head->next;
head->next = curr;
prev = head;
} else if(curr -> next -> next != NULL){
prev->next = curr->next;
curr->next = prev->next->next;
prev->next->next = curr;
}else if(head != curr){
prev = prev->next;
}else{}
}
return head;
}
Вы не можете поменять местами эти два узла. Как насчет узла, чей указатель «следующий» указывает на 'head', который вы переходите в' nodeSwap'? – paddy
Итак, вы пытаетесь создать пузырь-сортировку связанного списка, правильно? Если вы считаете, что это прямо, вы можете подумать еще об этом. Это может быть сделано * удивительно просто, но вы должны думать глубже. Что вы действительно меняете? – WhozCraig