关于约瑟夫以及拉丁方阵的问题在这里就不进行描述了,详见百度就行了,下面直接上代码
链表节点的定义
struct Node{
int data;
Node *next;
}
初始化该循环链表
Node* init_list(int num){
int i=1;
Node *tmp;
head=new Node;
head->next=NULL;
tmp=head;
while(i<=num){
Node * p= new Node;
p->data=i++;
p->next=NULL;
tmp->next=p;
tmp=p;
}
tmp->next=head->next;//这里最后一个元素的next指向头结点的next,也就是我们的第一个元素
return tmp->next;
}
主函数部分(约瑟夫)
int main(){
cout<<"请输入总人数"<<endl;
int num;
cin>>num;
cout<<"请输入间隔数"<<endl;
int n;
cin>>n;
Node *p=init_list(num);
while(p!=p->next){
for(int i=1;i<n-1;i++){//这里可以有两种做法,就是数到第N个的时候结束并且输出数据,也可以是
p=p->next;//数到N-1个,然后输出第N个元素的数据,不过第一种的话在进行删除的处理
}//会有一点麻烦,所以这里采用第二种做法
cout<<p->next->data<<" ";
Node *tmp=p->next;
p->next=tmp->next;
p=p->next;
delete(tmp);
}
cout<<p->data<<endl;
return 0;
}
主函数部分(拉丁方阵)
int main(){
cout<<"请输入方阵的大小"<<endl;
int num;
cin>>num;
Node *p=init(num);
int tmp1=num;
int tmp2=num;
while(tmp1--){
tmp2=num;
while(tmp2--){
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
p=p->next;//每输出一行就向右移动一次
}
cout<<endl;
return 0;
}