typedef int (*LinkSortCall)(LINKPTR plk1,LINKPTR plk2,void* param);
/*
功能:定義連接件的排序的回調函數
參數:plk1,plk2爲數據連接件指針,param爲回傳參數
返回:0爲(plk1)=(plk2),1爲(plk1)>(plk2),-1爲(plk1)<(plk2)
*/
XDL_API void BubbleSortLink(LINKPTR root,LinkSortCall pf,void* parm);
/*
功能:對鏈表進行冒泡排序
參數:root爲根連接件指針,pf爲排序回調函數,param爲回調參數
返回:無
*/
XDL_API void MergeSortLink(LINKPTR root,LinkSortCall pf,void* parm);
/*
功能:對鏈表進行歸併排序
參數:root爲根連接件指針,pf爲排序回調函數,param爲回調參數
返回:無
*/
void BubbleSortLink(LINKPTR root,LinkSortCall pf,void* parm)
{
LINKPTR prev,next;
int tag = 1;
assert(root && root->tag == lkRoot);
assert(pf);
while(tag)
{
tag = 0;
prev = GetFirstLink(root);
while(prev)
{
next = GetNextLink(prev);
if(next == NULL)
break;
if((*pf)(prev,next,parm) > 0)
{
SwitchLinkToNext(prev);
tag = 1;
}else
prev = next;
}
}
}
//劃分連接件
int _DivLink(LINKPTR root1,LINKPTR root2)
{
int count,tag;
tag = LinkCount(root1);
count = tag / 2;
while(count--)
{
InsertLink(root2,LINK_FIRST,DeleteLink(root1,LINK_LAST));
}
return tag;
}
//合併連接件
void _MrgLink(LINKPTR root1,LINKPTR root2,LinkSortCall pf,void* parm)
{
LINKPTR next1,next2;
LINKPTR plk;
next1 = GetFirstLink(root1);
next2 = GetFirstLink(root2);
while(next1 != NULL && next2 != NULL)
{
if((*pf)(next1,next2,parm) > 0)
{
plk = GetNextLink(next2);
InsertLinkBefore(root1,next1,DeleteLink(root2,next2));
next2 = plk;
}else
{
next1 = GetNextLink(next1);
}
}
while(next2 != NULL)
{
plk = GetNextLink(next2);
InsertLink(root1,LINK_LAST,DeleteLink(root2,next2));
next2 = plk;
}
}
void MergeSortLink(LINKPTR root,LinkSortCall pf,void* parm)
{
LINK lk;
InitRootLink(&lk);
if(_DivLink(root,&lk) > 1)
{
MergeSortLink(root,pf,parm);
MergeSortLink(&lk,pf,parm);
_MrgLink(root,&lk,pf,parm);
}
}