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ć:
- 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).
- Wyciek pamięci ale tego to już wgl. nie rozumiem.