约瑟夫环(Joseph)问题数据结构的实验。c++编程~

约瑟夫环(Joseph)问题的一种描述是:编号为1,2,…,n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个正整数作为报数的上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直到所有人全部出列为止。试通过类的设计求解约瑟夫环问题的出列顺序。具体的要求和说明如下: (1)利用单向循环链表存储结构模拟此过程,按照出列的顺序输出个人的编号。 (2)m的初值为20;n=7,7个人的密码依次为:3,1,7,2,4,8,4,首先m的值为6(正确的出列顺序应为:6,1,4,7,2,3,5)。 (3)程序运行后,首先要求用户指定初始报数的上限值,然后读取个人的密码。可设n<=30,此题所用的循环链表中不需要“头结点”,请注意空表和非空表的界限。 ============================= 要写实验报告的,标明数据结构设计,功能函数设计等

#include using namespace std; //每个人的号码和密码。 struct people { int NO; int pass; }node; template class Link { private: static Link * freelist;//静态数据成员的头接点。 public: struct people element; Link* next; Link(people elemval,Link* nextval=NULL) { element.NO=elemval.NO; element.pass=elemval.pass; next=nextval; } Link(Link* nextval=NULL) { next=nextval; } void* operator new(size_t);// 重载new 函数。 void operator delete(void*);//重载delete函数。 }; template class LList { private: Link *head; Link *tail; Link *fence; void init() { head=tail=fence=new Link ; tail->next=head->next; //生成链表是要把它的头接点和尾接点连接起来构成循环链表。 //因为有一个空的头接点。所以要把他的尾接点接到头接点的下一个指针。 } void removeall() { while(head!=NULL) { fence=head; fence=fence->next; delete fence; } } public: LList() { init(); } ~LList() { removeall(); } bool insert(const people& T); bool remove(Elem&); void getOut(int&,int&); void prev(); bool append(const people& T); }; 太长了。。。。去这里看 http://blog.programfan.com/article.asp?id=23037
温馨提示:答案为网友推荐,仅供参考
相似回答