用循环单链表实现约瑟夫环(不含头结点)

来源:互联网 发布:杭州淘宝g20怎么办 编辑:程序博客网 时间:2024/06/06 12:55
/***************************************用循环单链表实现约瑟夫环*************************************/
#include <iostream>


using namespace std;


class P
{
public:
    char data;
    P* next;
};


P *head;
void init()
{
    head=NULL;
}


void create_tail(int n,int m,int k)   //尾插法,不含头结点
{
    int i;
    char s;
    P *link,*q;
    q=NULL;
    for(i=0;i<n;i++)
    {
        link=new P;
        cout<<"请输入数据:";
        cin>>s;
        link->data=s;
        if(i==0)
            head=link;
        else
            q->next=link;
        q=link;
    }
    q->next=head; //尾指针指向第一个节点
    link=head;
    for(i=0;i<n;i++)
{
cout<<link->data<<"  ";
link=link->next;
}
cout<<endl<<"约瑟夫环为:"<<endl;
    
if(m==1)    //如果从第一个开始
{
        link=head;
        for(i=0;i<n-1;i++)
        link=link->next;   //link指向最后一个节点
cout<<head->data<<" ";
link->next=head->next;
head=head->next;//head指向第二个节点
q=head;
}
else
{
link=head;
q=head->next;
        for(i=0;i<m-2;i++)
{
link=link->next;
       q=q->next;
}
cout<<q->data<<" ";
link->next=q->next;
q=q->next;
}
n=n-1;
    while(n!=0)
{
         for(i=0;i<k-1;i++)
{
link=link->next;
q=q->next;
}
         cout<<q->data<<" ";
         link->next=q->next;
q=q->next;
n--;
}
cout<<endl;  
}


/********头插法没用到********************/
void create_head(int n,int m,int k)   //头插法,不含头结点
{
   int i;
    char s;
    P *link,*q;
    q=NULL;
    for(i=0;i<n;i++)

        link=new P;
        cout<<"请输入数据:";
        cin>>s;
        link->data=s;
        if(i==0)
{head=link;
link->next=head;  //尾指针指向第一个节点
}
        else
{head=link;
            link->next=q;
}
        q=link;
}
    link=head;
    for(i=0;i<n;i++)
{
cout<<link->data<<"  ";
link=link->next;
}
}

int main()
{
    int n,m,k;
    cout<<"请输入人数n,从第几个人开始m,循环的大小k"<<endl;
    cin>>n>>m>>k;
if(n<m)
{cout<<"请从新输入m的值,要小于n"<<endl;
      cin>>m;
}
    init();
    create_tail(n,m,k);
  //  create_head();
    return 0;
}