#include <afxtempl.h>
CNode* pNext;
CNode* pPrev;
TYPE data;
};
CNode* m_pNodeHead;
CNode* m_pNodeTail;
int m_nCount;
class CListEx : public CList<TYPE,ARG_TYPE >
{
public:
CListEx(){};
virtual ~CListEx(){};
void Sort(COMPARE_FUNC pFunc);
};
template< class TYPE, class ARG_TYPE >
void CListEx<TYPE,ARG_TYPE>::Sort(COMPARE_FUNC pFunc) //排序
{
CNode *p,*q,*small;
p=m_pNodeHead;
while(p)
{
small=p;
q=p->pNext;
while(q)
{
if((*pFunc)(&(q->data),&(small->data)))
small=q;
q=q->pNext;
}
if(small!=p)
{
TYPE temp=p->data;
p->data=small->data;
small->data=temp;
}
p=p->pNext;
/* MFC 定义的模板类CList的结构体 和节点
struct CNode
{CNode* pNext;
CNode* pPrev;
TYPE data;
};
CNode* m_pNodeHead;
CNode* m_pNodeTail;
int m_nCount;
*/
typedef bool(*COMPARE_FUNC)(void* p1,void *p2); //定义函数指针
template< class TYPE, class ARG_TYPE >class CListEx : public CList<TYPE,ARG_TYPE >
{
public:
CListEx(){};
virtual ~CListEx(){};
void Sort(COMPARE_FUNC pFunc);
};
template< class TYPE, class ARG_TYPE >
void CListEx<TYPE,ARG_TYPE>::Sort(COMPARE_FUNC pFunc) //排序
{
CNode *p,*q,*small;
p=m_pNodeHead;
while(p)
{
small=p;
q=p->pNext;
while(q)
{
if((*pFunc)(&(q->data),&(small->data)))
small=q;
q=q->pNext;
}
if(small!=p)
{
TYPE temp=p->data;
p->data=small->data;
small->data=temp;
}
p=p->pNext;
}
}
用法
bool byNum(void* p1,void* p2) //定义排序规则
{
SData* pd1=(SData*)p1;
SData* pd2=(SData*)p2;
return pd1->num<pd2->num;
}
CListEx<SData,SData>m_list;
m_list.Sort(byNum); //调用