#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include"linkedList.h"
void split(linkedList* source, linkedList* dest1, linkedList* dest2)
{
link* l = linkedListUnlinkFirst(source);
if(l != NULL)
{
linkedListAppendLink(dest1, l);
split(source, dest2, dest1);
}
}
void merge(linkedList* source1, linkedList* source2, linkedList* dest,
int (*inf)(void*, void*))
{
link *l1, *l2;
l1 = linkedListGetFirst(source1);
l2 = linkedListGetFirst(source2);
if (l1 != NULL || l2 != NULL)
{
if (l2 == NULL ||
(l1 != NULL && inf(l1->data, l2->data))
)
{
linkedListUnlinkFirst(source1);
linkedListAppendLink(dest, l1);
}
else
{
linkedListUnlinkFirst(source2);
linkedListAppendLink(dest, l2);
}
merge(source1, source2, dest, inf);
}
}
void doNothing(void* v)
{
}
void triFusion(linkedList* l, int (*inf)(void*, void*))
{
linkedList *l1, *l2;
if (linkedListGetSize(l) > 1)
{
l1 = linkedListCreate();
l2 = linkedListCreate();
split(l, l1, l2);
triFusion(l1, inf);
triFusion(l2, inf);
merge(l1, l2, l, inf);
linkedListDestroy(l1, doNothing);
linkedListDestroy(l2, doNothing);
}
}
/*----------------------------------------------------*/
int estInf(void* i, void* j)
{
return (*(int*)i <= *(int*)j ) ? 1 : 0;
}
void destroyInt(void* i)
{
free((int*)i);
}
int main()
{
int i = 1;
int* k;
linkedList* l = linkedListCreate();
link* lk;
for(i = 100 ; i > 0 ; i--)
{
k = (int*)malloc(sizeof(int));
*k = i;
linkedListAppend(l, k);
}
lk = linkedListGetFirst(l);
while(lk!=NULL)
{
printf("%d ", *((int*)(lk->data)));
lk = lk->next;
}
printf("\n");
triFusion(l, estInf);
lk = linkedListGetFirst(l);
while(lk!=NULL)
{
printf("%d ", *((int*)(lk->data)));
lk = lk->next;
}
printf("\n");
linkedListDestroy(l, destroyInt);
return 0;
}