您的位置:首页 > 其它

循环链表实现约瑟夫问题,拉丁方阵问题

2015-10-07 10:38 363 查看
关于约瑟夫以及拉丁方阵的问题在这里就不进行描述了,详见百度就行了,下面直接上代码

链表节点的定义

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: