《数据结构与算法分析》习题-----第二章(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     }

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