#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; }