您的位置:首页 > 其它

[原创] 编写函数,实现对链表元素的排序与分类

2016-03-20 16:31 399 查看
要求:存在很多元素,如<A,B>,<a,b>,<b,d>,<B, E>, <#,1>, <1, 8>,将这些元素进行分类并排序,

使之输出结果为:

<A,B> -- <B,E>;

<a,b> -- <b,d> ;

<#,1> -- <1,8>;

函数原型:list<listNode> listElementSort ( listNode * listnode);

输入:listnode是list类型,其内部各元素为Node类型;

    node定义如下: 

  typedef pair<string,string> Node;
typedef list<pair<string, string> > listNode;


输出:list<listNode>元素

源码实现:

#include <map>
#include <list>
#include <iostream>

using namespace std;

typedef pair<string, string> Node;
typedef list<pair<string, string> > listNode;

list<listNode> listElementSort(listNode *listnode)
{
map<string, listNode> mapBySTART;
map<string, listNode> mapByEND;

while((*listnode).size()>0){
Node node = (*listnode).front();
if(mapByEND.count(node.first)==0 && mapBySTART.count(node.second)==0){
listNode lst;
lst.push_back(node);
mapBySTART.insert(pair<string, listNode> (node.first, lst));
mapByEND.insert(pair<string, listNode> (node.second, lst));
}
if(mapByEND.count(node.first)==0 && mapBySTART.count(node.second)==1){
listNode mapStart_listNode_only = mapBySTART.find(node.second)->second;
mapStart_listNode_only.push_front(node);
mapBySTART.erase(node.second);
mapBySTART.insert(pair<string, listNode> (node.first, mapStart_listNode_only));
///modify mapByEnd
Node mapStart_endNode = mapStart_listNode_only.back();
mapByEND[mapStart_endNode.second] = mapStart_listNode_only;
}
if(mapByEND.count(node.first)==1 && mapBySTART.count(node.second)==0){
listNode mapEnd_listNode_only = mapByEND.find(node.first)->second;
mapEnd_listNode_only.push_back(node);
mapByEND.erase(node.first);
mapByEND.insert(pair<string, listNode> (node.second, mapEnd_listNode_only));
///modify mapByStart
Node mapEnd_startNode = mapEnd_listNode_only.front();
mapBySTART[mapEnd_startNode.first] = mapEnd_listNode_only;

}
if(mapByEND.count(node.first)==1 && mapBySTART.count(node.second)==1){
listNode mapEnd_listNode_both = mapByEND.find(node.first)->second;
listNode mapStart_listNode_both = mapBySTART.find(node.second)->second;
Node mapEnd_startNode_both_interval = mapEnd_listNode_both.front();
Node mapStart_endNode_both_interval = mapStart_listNode_both.back();

mapEnd_listNode_both.push_back(node);
for(listNode::iterator it=mapStart_listNode_both.begin(); it!=mapStart_listNode_both.end(); it++){
mapEnd_listNode_both.push_back(*it);
}
mapByEND[mapStart_endNode_both_interval.second] = mapEnd_listNode_both;
mapBySTART[mapEnd_startNode_both_interval.first]= mapEnd_listNode_both;
mapByEND.erase(node.first);
mapBySTART.erase(node.second);

}

(*listnode).pop_front();
}
///遍历map,获取返回值。
list<listNode> listlistnode;
for(map<string, listNode>::iterator it = mapByEND.begin(); it!=mapByEND.end();it++){
listlistnode.push_back(it->second);
}

return listlistnode;
}

int main()
{
listNode list1;
list1.push_back(Node("aa", "ab"));
list1.push_back(Node("ba", "bb"));
list1.push_back(Node("cc", "cd"));
list1.push_back(Node("bc", "bd"));
//list1.push_back(Node("ab", "ac"));
list1.push_back(Node("cb", "cc"));
list1.push_back(Node("bb", "bc"));
list1.push_back(Node("ca", "cb"));
list1.push_back(Node("ac", "ad"));

for(listNode::iterator it=list1.begin(); it!=list1.end();it++){
cout << it->first << " " << it->second << endl;
}
cout << "result:" <<endl;
list<listNode> listlistnode = listElementSort(&list1);
for(list<listNode>::iterator iter=listlistnode.begin(); iter != listlistnode.end(); iter++){
listNode listnode = *iter;
for(listNode::iterator it=listnode.begin(); it!=listnode.end(); it++){
cout << it->first << " " << it->second << " ";
}
cout << endl;
}
return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: