Я пытаюсь написать обобщенную функцию сортировки для связанного списка в C на основе алгоритма максимальной сортировки.Общий вид связанного списка в C
В настоящее время я тестирую функцию на строках, с моей функцией compareFunction является «strcmp», поэтому данные должны быть упорядочены в нисходящем лексикографическом порядке.
Исходные данные из списка: Chupakabra, Beach, Sandstorm, Dog, Bark.
Затем, после 1-й итерации цикла while в моей функции сортировки, я получаю Sandstorm, Beach, Sandstorm, Dog, Bark.
Однако, согласно printfs, «findGreatest» возвращает правильные значения при выходе, а также «свопит».
Может ли кто-нибудь помочь мне найти проблему с моей функцией сортировки?
ListResult listSort(List list, CompareListElements compareElement){
if(!list || !compareElement){
return LIST_NULL_ARGUMENT;
}
if (HEAD == NULL || HEAD->next == NULL){
return LIST_SUCCESS;
}
ListNode head = HEAD;
ListNode greatest;
while (head){
greatest = findGreatest (head, list, compareElement);
if (greatest == NULL){
return LIST_OUT_OF_MEMORY;
}
printf("Head data before swap: %s\n", (char*)head->data);
printf("Greatest data before swap: %s\n", (char*)greatest->data);
swap(&(head->data), &(greatest->data));
printf("New head data: %s\n", (char*)head->data);
printf("New greatest data: %s\n", (char*)greatest->data);
head = head->next;
}
return LIST_SUCCESS;
}
Struct, замещать & определения вспомогательной функции:
#define ITER list->iter
#define NEXT list->next
#define HEAD list->head
typedef struct ListNode {
ListElement data;
struct ListNode* next;
} *ListNode;
struct List_t {
ListNode head;
CopyListElement copyElement;
FreeListElement freeElement;
ListNode iter;
};
void swap (ListElement* element1, ListElement* element2){
ListElement* temp = *element1;
*element1 = *element2;
*element2 = temp;
}
ListNode findGreatest (ListNode head, List list, CompareListElements compareElement){
ListNode greatest = malloc(sizeof(*greatest));
ListNode current = malloc(sizeof(*current));
if (greatest == NULL || current == NULL){
return NULL;
}
greatest->data = head->data;
greatest->next = head->next;
current->data = head->data;
current->next = head->next;
while (current){
if (compareElement(greatest->data, current->data) > 0){
greatest->data = current->data;
greatest->next = current->next;
}
current = current->next;
}
free(current);
return greatest;
}
Я проверил функцию подкачки из основной и, кажется, работает хорошо.
Пожалуйста, включите полную программу: Что такое 'List'definition? Что такое определение 'findGreatest()'? – jdarthenay
Мы, вероятно, также должны увидеть ваше определение 'swap', так как оно похоже на замену вместо замены. –
'ListNode head = HEAD;' (-> как 'ListNode head = list-> head;')? также 'findGreatest (head, list, compareElement);' -> 'findGreatest (head, compareElement);'? – BLUEPIXY