2016-04-21 5 views
0

Я пытаюсь написать обобщенную функцию сортировки для связанного списка в 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; 
} 

Я проверил функцию подкачки из основной и, кажется, работает хорошо.

+4

Пожалуйста, включите полную программу: Что такое 'List'definition? Что такое определение 'findGreatest()'? – jdarthenay

+2

Мы, вероятно, также должны увидеть ваше определение 'swap', так как оно похоже на замену вместо замены. –

+0

'ListNode head = HEAD;' (-> как 'ListNode head = list-> head;')? также 'findGreatest (head, list, compareElement);' -> 'findGreatest (head, compareElement);'? – BLUEPIXY

ответ

0

список: Chupakabra, Beach, Sandstorm, Dog, Bark
первый раз greatest элемент Sandstorm.
элемент управления головой элемент Sandstorm элемент, но ваш findGreatest клон возврата.
Так
& (Sandstorm -> данные)! = & greatest-> Данные Поскольку greatest были вновь выделены.
(Таким образом, вы получите Sandstorm, Beach, Sandstorm, Dog, Bark)

Так что попробуйте это

void swap (ListElement* element1, ListElement* element2){ 
    ListElement temp = *element1;//element1 dereference type is ListElement 
    *element1 = *element2; 
    *element2 = temp; 
} 

ListNode findGreatest (ListNode head, CompareListElements compareElement){// "List list," unused list 
    ListNode greatest = head; 
    ListNode current; 

    if (greatest == NULL || greatest->next == NULL){ 
     return greatest; 
    } 
    current = head->next; 
    while (current){ 
     if (compareElement(greatest->data, current->data) > 0){ 
      greatest = current; 
     } 
     current = current->next; 
    } 
    return greatest; 
} 
+0

Большое вам спасибо! Он работает и, кажется, намного проще, чем то, что я написал со всеми динамическими выделениями. – Alice312

+0

@ Alice312 принять этот ответ, если проблема решена. – BLUEPIXY

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