仅使用基本的表操作实现两个排序后的表L1和L2的并集
2012-11-27 13:28
633 查看
针对Weiss著的《数据结构与算法分析(C++描述+第三版)习题答案中的3.5题的分析
原题:给定两个排序后的表L1和L2,。写出一个程序仅使用基本的表操作来计算L1UL2。习题答案中的程序如下:
// Assumes both input lists are sorted template <typename Object> list<Object> listUnion( const list<Object> & L1, const list<Object> & L2) { list<Object> result; typename list<Object>:: const_iterator iterL1 = L1.begin(); typename list<Object>:: 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<iostream> #include<list> using namespace std; template <typename Object> list<Object> listUnion( const list<Object> & L1, const list<Object> & L2) { list<Object> result; typename list<Object>:: const_iterator iterL1 = L1.begin(); typename list<Object>:: 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<char> L1,L2,L3; int i=0; char p; cout<<"start input 5 elements for list L1:"<<endl; for(i=0;i<5;i++) { cin>>p; L1.push_back(p); } cout<<"end input for list L1"<<endl; cout<<"start input 5 elements for list L2:"<<endl; for(i=0;i<5;i++) { cin>>p; L2.push_back(p); } cout<<"end input for list L2"<<endl; L3=listUnion(L1,L2); cout<<"the result of L1 union L2 :"<<endl; for(list<char>::iterator itr=L3.begin();itr!=L3.end();itr++) cout<<*itr<<endl; return 0; }
相关文章推荐
- 给定两个已排序的表L1和L2 只使用基本的表操作编写计算L1∪L2的过程 并集
- 给定两个已排序的表L1和L2 只使用基本的表操作编写计算L1∩L2的过程 交集
- 数据结构与算法分析 c++11 练习3.4 3.5 给定两个已排序的表L1和L2,求交集和并集
- linux下使用vim实现基于静态数组的顺序表的一些基本操作
- 使用datepicker插件实现日期选择的基本操作 8-5
- 二、 编写一个类,用两个栈实现队列,支持队列的基本操作(add,poll,peek)
- Java实现对两个List快速去重并排序操作示例
- 使用C++实现链表的基本操作
- 数据结构 编写一个类,用两个栈实现队列,支持队列的基本操作(add 、poll、peek)
- 使用两个Stack类(JDK容器类库中的Stack类)实现一个队列类MyQueue,提供队列的入队列和出队列操作:enQueue和deQueue
- 4.第三单元任务三实训:编写一个类ExceptionTest,在main方法中使用try-catch-finally语句结构实现:在try语句块中,编写两个数相除操作,相除的两个操作数要求程序运行时用
- C语言提高-第26/27讲: 实现线性表基本操作的函数/编写查找和排序函数
- 使用javascript操作多选列表框,实现动态增加删除,左右移动,上下排序移动等功能。
- 使用HDFS API实现hadoop HDFS文件系统的基本操作
- 使用sortable插件实现列表中表项的拖曳排序操作8-3
- 使用Javascript实现Dropdownlist级联操作中遇到的两个错误
- 使用datepicker插件实现日期选择的基本操作 8-5
- csdn 在c++ builder中,使用treeview实现对xml文档增加删除修改和查询等基本操作
- 不使用库实现栈的基本操作
- Java表格仿mysql实现基本操作(连接,分组排序,统计等)