台湾版杀手情人 下载:有那位学数据结构的朋友帮我解决一下这个问题?

来源:百度文库 编辑:高校问答 时间:2024/05/07 06:15:00
设计一个程序求出约瑟夫环的出列顺序.约瑟夫环问题的一种描述是:编号为1,2,3.......n的N个人按顺时针方向围做一圈,每人持有一个密码(正整数).一开始任选一个正整数作为报数上限值M,从第一个人开始按顺时针方向从1开始顺序报数,报到M时停止报数,报M的人出列,将他的密码作为新的M值,从他在顺时针方向上的下一个人开始重新从1报,如此下去,直到所有的人出列为止.例如N=7,7个人的密码依次为3,1,7,2,4,8,4,M的初始值取6,则正确的出列顺序为6,1,4,7,2,3,5.要求使用单向循环链表模拟此出列过程.

#include <iostream.h>
#include <iomanip.h>

#include "josephus.h"

template <class Type> CircListNode<Type>::CircListNode( Type d , CircListNode<Type> *next )
{
data = d;
link = next;
}

template <class Type> CircList<Type>::CircList( Type value )
{
first = current =last = new CircListNode<Type> (value);
first->link = first;
}

template <class Type> CircList<Type>::~CircList(void)
{
cout << "The CircList has been successfully destructed" << endl;
}

template <class Type> int CircList<Type>::Length(void) const
{
int count = 1;
CircListNode<Type> *find = first->link;
while ( find != first )
{
find = find->link;
count++;
}
return count;
}

template <class Type> Boolean CircList<Type>::Find( const Type &value ) const
{
CircListNode<Type> *find = first;
while ( find->data != value && find->link != first )
{
find = find->link;
}
if ( find->data == value )
{
return True;
}
else
{
return False;
}
}

template <class Type> Boolean CircList<Type>::Next(void)
{
current = current->link;
return True;
}

template <class Type> Boolean CircList<Type>::Prior(void)
{
CircListNode<Type> *prior = first;
while ( prior->link != current )
{
prior = prior->link;
}
current = prior;
return True;
}

template <class Type> void CircList<Type>::Insert( const Type &value )
{
CircListNode<Type> *temp;
temp = new CircListNode<Type> (value);

temp->link = current->link;
current->link = temp;

if ( current == last )
{
last = temp;
}
return;
}

template <class Type> void CircList<Type>::Remove(void)
{
if ( current == first )
{
if ( first != last )
{
first = current->link;
delete current;
current = first;
last->link = first;
}
else
{
delete current;
first = current = last = NULL;
}
}
else
{
if ( current == last )
{
Prior();
current->link = last->link;//first
delete last;
last = current;
current = first;
}
else
{
CircListNode<Type> *temp = current;
Prior();
current->link = temp->link;
delete temp;
Next();
}
}
return;
}

template <class Type> void CircList<Type>::Traverse(void)
{
if ( !first || !last || !current )
{
cerr << "Illegal address" << endl;
exit(1);
}
CircListNode<Type> *traverse = first;

while ( traverse != last )
{
cout << setw(3) << traverse->data;
traverse = traverse->link;
}
cout << setw(3) << traverse->data << endl;//last node
return;
}

template <class Type> void CircList<Type>::Josephus(int n, int m)
{
current = first;
int count = 0;

while ( first != last )
{
if ( count == m )
{
count = 0;
Prior();
cout << "Number " << current->data << " has been rejected" << endl;
Remove();
}
else
{
count++;
Next();
}
}
cout << "The winner is : number " << current->data << endl;
}

int main()
{
CircList<int> josephus(1);

for ( int i = 2; i <= MAXPASSENGERS; i++ )
{
josephus.Insert(i);
josephus.Next();
}

cout << "The Josephus question :" << endl;

josephus.Traverse();
cout << endl;

josephus.Josephus(8,3);

return 0;
}
//josephus.cpp

我喜编程
做的很好,很好