merge sort (sortowanie przez scalanie) listy i znikające węzły

0

Witam.
Mam następujący problem. Przy sortowaniu przez scalanie, znika mi część węzłów listy.
Mam taką oto strukturę

typedef struct element {
    struct element *next;
    double ISBN;
    char tytul[MAX_STR];
    char autor[MAX_STR];
    char wydawnictwo[MAX_STR];
    int rokWydania;
}book;

uzupełnioną w następujący sposób

1000000000000;aaa;CDE;acb;1
2000000000000;acb;EDC;aba;3
1000000000001;aba;cde;baa;6
1000000000002;baa;cde;cab;4
1000000000011;cab;cde;ddd;2
1000000000005;ddd;cde;aab;7
1000000000010;aab;cde;aaa;5

A oto i funkcja sortująca

book * merge(book * headOne, book * head_two, int col)
{
    book *head_three;
    int flaga=0;

    if(headOne == NULL)
        return head_two;

    if(head_two == NULL)
        return headOne;

    switch(col)
    {
        case 0:
                if(headOne->ISBN <= head_two->ISBN)
                    flaga=1;
                break;
        case 1:
                if(strncmp(headOne->tytul,head_two->tytul,MAX_STR) <= 0)
                    flaga=1;
                break;
        case 2:
                if(strncmp(headOne->autor,head_two->autor,MAX_STR) <= 0)
                    flaga=1;
                break;
        case 3:
                if(strncmp(headOne->wydawnictwo,head_two->wydawnictwo,MAX_STR) <= 0)
                    flaga=1;
                break;
        case 4:
                if(headOne->rokWydania <= head_two->rokWydania)
                    flaga=1;
                break;
    }

    if(flaga==1) {
        head_three = headOne;
        head_three->next = merge(headOne->next, head_two, col);
    } else {
        head_three = head_two;
        head_three->next = merge(headOne, head_two->next, col);
    }

    return head_three;
}

book * sortData(book *head, int col)
{
    book *headOne;
    book *headTwo;

    if((head == NULL) || (head->next == NULL))
        return head;

    headOne = head;
    headTwo = head->next;

    while((headTwo != NULL) && (headTwo->next != NULL))
    {
        head = head->next;
        headTwo = head->next->next;
    }
    headTwo = head->next;
    head->next = NULL;
    return merge(sortData(headOne,col), sortData(headTwo,col),col);
}

parametr col który przekazuję, określa wg. którego pola ma sortować węzły listy.

Sortowanie działa dla wszystkich wartości oprócz col=3 :o Gdy sortuję przy parametrze col=3, czyli sortowanie pola 'wydawnictwo'
Wydaje mi się to strasznie dziwne. Mam 2 teorie tylko nie wiem jak je sprawdzić:

  1. Jakieś przepełnienie bufora. Bo gdy podstawiłem inne dane do rekordów to łapało glebę także dla któryś innych pól (ale chyba zawsze dotyczyło to tylko stringów(tablicy charów).
  2. Wyciek pamięci ale tego to już wgl. nie rozumiem.
1

Wyświetl sobie jakie listy przekazujesz do merge w sortData

0

_13th_Dragon - niestety chyba nie rozumiem jak miałbym to zrobić. Debuggerem?

Ale problem chyba rozwiązałem. To chyba głupi błąd. Wywoływałem funkcję sortData(first,flaga) teraz zrobiłem first=sortData(first,flaga) i działa więc zaczynam sobie zadawać klasyczne pytanie: "Jakim cudem to wcześniej działało?" chyba, że przez przypadek za którymś razem usunąłem ten nieszczęsny kawałek kodu.

1
void printData(book *node) { for(;node;node=node->next) printf("%s\n",node->tytul); }

1 użytkowników online, w tym zalogowanych: 0, gości: 1