月明三更 电视剧粤语:c语言 约瑟夫问题

来源:百度文库 编辑:高校问答 时间:2024/04/23 20:18:23

这是c++的,稍微修改一下就是c的程序了
#include <iostream.h>
#include <stdlib.h>
class CircList;
class CircListNode
{
friend class CircList;
public:
CircListNode(int d = 0, CircListNode *next = NULL)
: data( d ), link( next ) {}
int data;
CircListNode *link;
};
class CircList
{friend ostream & operator<<(ostream &, CircList &);
public:
CircList(int , int );
~CircList();
void MakeEmpty();
int getData() const;
void Remove();
void Insert(const int &);
void Next() { current = current->link; }
void Josephus();
private:
CircListNode *first, *current;
int person, recycle;
};
CircList ::CircList(int p, int r)
{
if(!p || !r)
{
cout<<"Error set for person and recycle!"<<endl;
exit(0);
}
person = p;
recycle = r;
current = first = new CircListNode(1, first);
if(p > 1)
{
int i = 1;
while(i++ < p)
Insert(i);

}
}
void CircList::Insert(const int & value)
{
current = current->link = new CircListNode(value, first);
}
void CircList ::MakeEmpty()
{
CircListNode *q;
while(first->link != first)
{
q = first->link;
first->link = q->link;
delete q;
}
}
int CircList::getData() const
{
return current->data;
}
void CircList::Remove()
{
if(first->link == first)
{
delete first;
exit(0);
}
CircListNode *q = first;
while(q->link != current)
q = q->link;
if(current == first)
{
q->link = first->link;
q = first;
current = first = first->link;
}
else
{
q->link = current->link;
q = current;
current = current->link;
}
delete q;
}
void CircList::Josephus()
{
current = first;
for(int i = 1; i <= person; i++)
{
for(int j = 1; j < recycle; j++)
Next();
cout<<"Delete person "<<getData()<<endl;
Remove();
// cout<<*this;
}
}

CircList::~CircList()
{
MakeEmpty();
delete first;
}
ostream & operator<<(ostream & output, CircList &c)
{
CircListNode *p = c.first;
cout<<"The list is :"<<endl;
for(; p->link != c.first; p = p->link)
cout<<p->data<<endl;
cout<<p->data<<endl;
return output;
}
int main(int argc, char* argv[])
{
CircList clist(9, 5);//共9个人,从第
//5个开始报数
clist.Josephus();
return 0;
}
参考资料:我的作业答案