仅使用基本的表操作实现两个排序后的表L1和L2的并集

针对Weiss著的《数据结构与算法分析(C++描述+第三版)习题答案中的3.5题的分析

原题:给定两个排序后的表L1和L2,。写出一个程序仅使用基本的表操作来计算L1UL2。
习题答案中的程序如下:
// Assumes both input lists are sorted  
template   
list listUnion( const list & L1,  
const list & L2)  
{  
    list result;  
    typename list:: const_iterator iterL1 = L1.begin();  
    typename list:: const_iterator iterL2= L2.begin();  
    while(iterL1 != L1.end() && iterL2 != L2.end())  
    {  
        if (*iterL1 == *iterL2)  
        {  
            result.push_back(*iterL1);  
            iterL1++;  
            iterL2++;  
        }  
        else if (*iterL1 < *iterL2)  
        {  
            result.push_back(*iterL1);  
            iterL1++;  
        }  
        else  
        {  
            result.push_back(*iterL2);  
            iterL2++;  
        }  
    }  
    return result;  
}上述程序会有这样一个问题,当iterL1或者iterL2指向end时,程序将直接结束,实际上表L1或者L2中还有元素没有处理,这样并没有完成真正的并集运算。 
   
下边是自己对此函数的改进并加了一个简单的测试程序:
#include  
#include  
using namespace std;  
template   
list listUnion( const list & L1, const list & L2)  
{  
    list result;  
    typename list:: const_iterator iterL1 = L1.begin();  
    typename list:: const_iterator iterL2= L2.begin();  
    while(iterL1 != L1.end() || iterL2 != L2.end())  
    {  
        if(iterL1==L1.end() && iterL2 != L2.end())  
            result.push_back(*iterL2++);  
        else if(iterL1 != L1.end() && iterL2==L2.end())  
            result.push_back(*iterL1++);          
        else if (*iterL1 == *iterL2)  
        {  
            result.push_back(*iterL1);  
            iterL1++;  
            iterL2++;  
        }  
        else if (*iterL1 < *iterL2)  
            result.push_back(*iterL1++);  
        else if (*iterL1 > *iterL2)  
            result.push_back(*iterL2++);  
    }  
    return result;  
}  
int main()  
{  
    list L1,L2,L3;  
    int i=0;  
    char p;  
    cout<<"start input 5 elements for list L1:"<>p;  
        L1.push_back(p);  
    }  
    cout<<"end input for list L1"<>p;  
        L2.push_back(p);  
    }  
    cout<<"end input for list L2"<::iterator itr=L3.begin();itr!=L3.end();itr++)  
        cout<<*itr< 
   


你可能感兴趣的:(数据结构与算法)