以下代码实现功能:
1.在即时通讯软件中,一般都有"好友列表"功能,好友上限假定为5000
2.每个好友的数据结构为:用户唯一标识、用户账号、用户名称、用户在线状态
3.好友列表使用std::list作为数据容器
4.列表中实现了好友列表排序功能,排序
在代码实现中,当用户在线状态与用户昵称均相同的情况下,对应的数据节点在friendList中相对位置不稳定。例如A,B1,B2, C, D这5个好友用户,排序优先级为A > B1 = B2 > C > D,即B1,B2的在线状态与用户昵称均相同,每次排序后B1,B2的位置会互换。
修改上述代码来实现相同排序优先级的元素,在每次排序后位置保持相对稳定,例如B1始终排在B2前面,或B1始终排在B2后面。
struct tFriendData
{
unsigned int uUserID; // 用户唯一标识
unsigned char uStatus; // 用户在线状态: 0表示离线, 1表示在线
std::string strUserNickname;// 用户昵称
};
static bool FriendSortFunc(tFriendData* pFriend1, tFriendData* pFriend2)
{
if (!pFriend1 || !pFriend2)
{
return pFriend1 ? true : false;
}
if (pFriend1->uStatus > pFriend2->uStatus)
{
return true;
}
if (pFriend1->uStatus < pFriend2->uStatus)
{
return false;
}
int nRet = _stricmp(pFriend1->strUserNickname.c_str(), pFriend2->strUserNickname.c_str());
if (nRet < 0)
{
return true;
}
else if (nRet > 0)
{
return false;
}
return false;
}
int main(int argc, char *argv[])
{
std::list<tFriendData*> listFriend;
// ...
listFriend.sort(FriendSortFunc);
// ...
return 0;
}