约瑟夫环问题(不带头结点单循环链表实现和数组实现)

Q:略

        A:

                  为了简化过程,类中只有3个函数即可,构造,增加,约瑟夫环解决函数

   Ps:做这道题是为了巩固链表知识,在这过程中,this指针很隐蔽,,

 Code;

 #include<iostream>
using namespace std;
template<class T>
struct LinkNode
{
       T data;
       LinkNode<T>*link;
       LinkNode(LinkNode<T>*ptr=NULL) { link=ptr;}
       LinkNode(T item,LinkNode<T>*ptr=NULL) { data=item;link=ptr;}
};
template<class T>
class CList
{
      private:
              LinkNode<T>*first;
      public:
              CList() { first=NULL;}
            //  ~CList() { makeEmpty();}
            //  void makeEmpty();
              bool Insert(int i,T x);
              void Print();
              bool Delete(int i,T& x);
              void Josephs(CList<T> A,int n,int m);
};
     template<class T>
     bool CList<T>::Insert(int i,T x)
     {
           if(first==NULL)
           {
             first=new LinkNode<T>(x);
             first->link=first;
             return true;
           }
           else
           {
               int j=1;
               LinkNode<T>*current=first;
               while(j<i)
               {
                 current=current->link;
                 ++j;
               }
               LinkNode<T>*newNode=new LinkNode<T>(x);
               newNode->link=current->link;
               current->link=newNode;
               return true;
           }
     }
     template<class T>
     void CList<T>::Print()
     {
          LinkNode<T>*current=first->link;
          cout<<first->data<<” “;
          while(current!=first)
          {
           cout<<current->data<<” “;
           current=current->link;
          }
     }
     template<class T>
     bool CList<T>::Delete(int i,T& x)
     {
          LinkNode<T>*current=first;
          if(i==1)
          {
                while(current->link!=first)
                {
                  current=current->link;
                }
                first=first->link;
                current->link=first;
          }
        else
        {
            int j=1;
            LinkNode<T>*p=first;
            while(j<i)
            {
               p=current;
               current=current->link;
               ++j;
            }
            p->link=current->link;
            delete current;
        }
     }              
     template<class T>
     void CList<T>::Josephs(CList<T> B,int n,int m)
     {
          for(int i=0;i<n;++i)
          B.Insert(i,i+1);
          int j,x,n1;
          LinkNode<T>*current=B.first;
          LinkNode<T>*p=NULL;
          for(j=1;j<n;++j)
          {
            for(n1=1;n1<m;++n1)
            {
              p=current;
              current=current->link;
            }
            cout<<“出列的人是”<<current->data<<” “; 
            p->link=current->link;
            delete current;
            current=p->link;
          }
     }
     int main()
     {
         CList<int> A;
         CList<int> B;
         A.Josephs(B,10,3);
         system(“pause”);
         return 0;
     }
    2.数组实现

   思路:每次把出列的数移到数组最后一项,这样方便得出下一次报数时下标的规律

   Code:

        #include<iostream>
using namespace std;
#define MAX  10
int main()
{
    int a[MAX];
    int n,m,s;
    cin>>n>>m;
    for(int i=0;i<n;++i)
    cin>>a[i];
    void Josephs(int a[],int n,int m);
    Josephs(a,n,m);
    system(“pause”);
    return 0;
}
    void Josephs(int a[],int n,int m)
    {
         int s=0;
         int k=n,temp,b=n;
         for(int j=1;j<n;++j)     //删除n-1次
         {
                 s=(m-1+s)%b;
                 cout<<“出列的是”<<a[s]<<” “;
                 //改变数组
                 temp=a[s];
                 for(int m=s;m<k-1;++m)
                 {
                     a[m]=a[m+1];
                 }
                 a[k-1]=temp; 
                 b–;
         }
    }

 

    原文作者:约瑟夫环问题
    原文地址: https://blog.csdn.net/ssk476079956/article/details/7660012
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞