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;
    
    }
  • 相关阅读:
    乱谈数学--傅里叶变换(级数)的原理(一)
    Linux day03
    Linux day02
    Linux day01(二)虚拟机快照和克隆的用法介绍
    Linux day01(一) 创建Linux虚拟机,设置虚拟机默认属性,虚拟机和Xhell建立连接
    Django day 38 结算中心,支付中心,计算价格方法
    Django day 37 网站视频的播放,购物车接口,优惠券表分析
    Django day 36 支付宝支付,微信推送
    Django day35 redis连接池,redis-list操作,django中使用redis,支付宝支付
    Django day 34 过滤课程,登录,redis,python操作redis
  • 原文地址:https://www.cnblogs.com/lifeinsmile/p/5245672.html
Copyright © 2011-2022 走看看