这些题目是关于list的题目,只是给出实现题目要求的代码,整个完整程序是用List的代码实现的代码。
List代码实现:http://www.cnblogs.com/alan-forever/archive/2012/09/12/2682437.html
PS:思考时有些先入为主,影响对解法的思考·····以后要注意····
3.6 Josephus问题。有N个人坐成一圈,编号为1至N。从编号为1的人开始传热马铃薯。M次传递之后,持有马铃薯的人退出游戏,圈缩小,然后游戏从退出人下面的人开始,
继续进行。最后留下来的人胜利。这样,如果M=0并且N=5,那么参加游戏的人依次退出,5号获胜。如果M=1并且N=5,那么退出的顺序为2、4、1、5
3号获胜
PS:使用了STL的list,为了方便,如果想了解list的操作可以到这里看看:http://www.cnblogs.com/alan-forever/archive/2012/09/11/2680033.html
1 #include<iostream> 2 #include<list> 3 using namespace std; 4 5 int main( ) 6 { 7 int m, n, M, Lsize; 8 //while( cin >> m >> n ) 9 //{ 10 cout << "请输入M,N!" << endl; 11 cin >> m >> n; 12 list<int> l; 13 list<int>::iterator iter; 14 for( int i = 1; i <= n; ++i ) 15 { 16 l.push_back( i ); 17 } 18 iter = l.begin(); 19 20 for( int j = 1; j <= n; ++j ) 21 { 22 Lsize = l.size( ); 23 M = m % Lsize; //确保每次传递不会超过一圈!提高效率! 24 for( int i = 1; i <= M; ++i ) 25 { 26 iter++; 27 if( iter == l.end( ) ) 28 iter = l.begin( ); 29 /*if( iter == l.begin( ) ) 30 iter = --l.end( );*/ 31 } 32 33 cout << *iter << " "; 34 iter = l.erase( iter ); 35 if( iter == l.end( ) ) 36 { 37 iter = l.begin( ); 38 } 39 } 40 cout << endl; 41 //} 42 return 0; 43 }
3.1 给定一个链表L和另一个链表P,它们包含以升序排序的整数。操作printLots(L,P)将打印L中的那些由P所指定的位置上的元素。例如
如果P = 1,3,4,6,那么L中的第1,3,4,6个元素被打印出来。写出过程printLots(L,P)。只可以使用公有的STL容器操作。该运行的时间是多少?
1 void printLots( List<int> & l , List<int> & p ) 2 { 3 List<int>::iterator itr_L = l.begin(); 4 int start = 0; 5 for( List<int>::iterator itr_P = p.begin(); itr_P != p.end(); ++itr_P ) 6 { 7 while( start < *itr_P && itr_L != l.end() ) 8 { 9 ++start; 10 ++itr_L; 11 } 12 if( itr_L != l.end() ) 13 cout << *itr_L <<" "; 14 } 15 cout << endl; 16 }
3.4 给定两个排序后的表L1和L2。写出一个程序仅使用基本的表操作来计算L1∩L2。
1 void List_And( List<int> & l1, List<int> & l2 ) 2 { 3 List<int>::iterator itr1 = l1.begin(); 4 List<int>::iterator itr2 = l2.begin(); 5 6 while( itr1 != l1.end() && itr2 != l2.end() ) 7 { 8 if( *itr1 == *itr2 ) 9 { 10 cout << *itr1 << " "; 11 if( itr1 != l1.end() || itr2 != l2.end() ) 12 { 13 14 ++itr1; 15 ++itr2; 16 } 17 } 18 else if( *itr1 < *itr2 ) 19 { 20 if( itr1 != l1.end() ) 21 ++itr1; 22 } 23 else 24 { 25 if( itr2 != l2.end() ) 26 ++itr2; 27 } 28 } 29 cout << endl; 30 }
3.5 给定两个排序后的表L1和L2。写出一个程序仅使用基本的表操作来计算L1∪L2。
1 void List_Or( List<int> & l1, List<int> & l2 ) 2 { 3 List<int>::iterator itr1 = l1.begin(); 4 List<int>::iterator itr2 = l2.begin(); 5 6 while( 1 ) 7 { 8 if( itr1 != l1.end() && itr2 != l2.end() ) 9 { 10 if( *itr1 == *itr2 ) 11 { 12 cout << *itr1 << " "; 13 ++itr1; 14 ++itr2; 15 } 16 else if( *itr1 < *itr2 ) 17 { 18 cout << *itr1 << " "; 19 ++itr1; 20 } 21 else 22 { 23 cout << *itr2 << " "; 24 ++itr2; 25 } 26 } 27 else if( itr1 == l1.end() && itr2 != l2.end() ) 28 { 29 cout << *itr2 << " "; 30 ++itr2; 31 } 32 else if( itr2 == l2.end() && itr1 != l1.end() ) 33 { 34 cout << *itr1 << " "; 35 ++itr1; 36 } 37 38 } 39 cout << endl; 40 }
3.12读STL迭代器的值需要operator++操作,该操作依次推进迭代器。在某些情况下,读表中下一项的值而不推进迭代器也许更好。写出声明的成员函数来实现一般情况下的这个功能。
iterator operator++( int k )
PS:本来应该是const_iterator,不过有些小问题·······
1 iterator operator+( int k ) 2 { 3 iterator itr = *this; 4 for( int i = 1; i <= k; ++i ) 5 itr.current = itr.current->next; 6 return itr; 7 }
3.3实现STL的find例程。该例程返回的iterator包含从start开始一直到end(不包含end)的范围内第一个出现的x。
PS:修改了一些东西,该为友元函数,因为尝试类外函数实现不了(个人问题)·······
1 friend iterator find(iterator start, iterator end, const Object & x ) 2 { 3 iterator itr = start; 4 while( itr != end && *itr != x ) 5 { 6 ++itr; 7 } 8 return itr; 9 }