zoukankan      html  css  js  c++  java
  • [原创] 编写函数,实现对链表元素的排序与分类

    要求:存在很多元素,如<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;
    
    }
  • 相关阅读:
    IOS设计模式之四(备忘录模式,命令模式)
    IOS设计模式之三(适配器模式,观察者模式)
    IOS设计模式之二(门面模式,装饰器模式)
    IOS设计模式之一(MVC模式,单例模式)
    C#调用C++导出(dllexport)方法
    C# 多任务之 Task
    C# Remoting的一个简单例子
    C#中指针使用总结
    C# fixed详解
    C#中virtual和abstract的区别
  • 原文地址:https://www.cnblogs.com/lifeinsmile/p/5245672.html
Copyright © 2011-2022 走看看