《数据结构与算法分析》习题-----第二章(1)(关于list的题目)

这些题目是关于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     }
posted @ 2012-09-25 19:44  alan_forever  阅读(1910)  评论(0编辑  收藏  举报