PTA 7-6 约瑟夫环 (25 分)

7-6 约瑟夫环 (25 分)

#include 
using namespace std;
template <typename T>
struct CircLinkNode
{
    T data;
    CircLinkNode* next;
    CircLinkNode(const T& item,CircLinkNode<T>* ptr=NULL)
    {
        data=item;
        next=ptr;
    }
    CircLinkNode(CircLinkNode<T>* ptr=NULL)
    {
        next=ptr;
    }
};
template <typename T>      //链表类定义
class CircList
{
private:
    CircLinkNode<T> *first, *last;  //头指针, 尾指针
public:
    CircList()
    {
        first=last=NULL;
    }
    CircList(const T& x)           //构造函数
    {
        CircLinkNode<T> *c=new CircLinkNode<T>(x);
        first=last=c;
        first->next=last;
        last->next=first;
    }
    CircList(const CircList<T>& L)        //复制构造函数
    {
        CircLinkNode<T> *newNode,*iter,*rear;
        if(L.first==NULL)
            return;
        newNode=new CircLinkNode<T>(L.first->data);
        first=last=newNode;
        iter=L.first->next;
        rear=newNode;
        while(iter)
        {
            newNode=new CircLinkNode<T>(iter->data);
            rear->next=newNode;
            iter=iter->next;
            rear=rear->next;
        }
        last=rear;
        last->next=first;
    }
    /*   CircList operator=(const CircList& L)  // 赋值运算符函数
       {
           if(this==&L)
               return *this;
           MakeEmpty();
           CircLinkNode *newNode,*iter,*rear;
           if(L.first==NULL)
               return;
           newNode=new CircLinkNode(L.first->data);
           first=last=newNode;
           iter=L.first->next;
           rear=newNode;
           while(iter)
           {
               newNode=new CircLinkNode(iter->data);
               rear->next=newNode;
               iter=iter->next;
               rear=rear->next;
           }
           last=rear;
           last->next=first;
           return *this;
       }*/
    /*   ~CircList()    //析构函数
       {
           MakeEmpty();
       }
       void MakeEmpty()//清空链表
       {
           CircLinkNode *p;
           while(p!=NULL)
           {
               p=first;
               first=first->next;
               delete p;
           }
       }*/
    bool Insert ( int i, const T& x ) //插入
    {
        CircLinkNode<T> *pre;
        CircLinkNode<T> *newNode;
        pre=first;
        if(i==1)
        {
            newNode=new CircLinkNode<T>(x);
            if(first==NULL)
            {
                first=newNode;
                last=newNode;
                first->next=last;
                last->next=first;
                return true;
            }
            else
            {
                newNode->next=first;
                last->next=newNode;
                first=newNode;
                return true;
            }
        }
        else
        {
            for(int j=1; j<i; j++)
            {
                pre=pre->next;
            }
            newNode=new CircLinkNode<T>(x);
            newNode->next=pre->next;
            pre->next=newNode;
            return true;
        }
    }
    bool Remove ( int i, T& x)    //删除
    {
        CircLinkNode<T> *p,*q;
        if(i==1)
        {
            p=first;
            if(Length()==1)
            {
                delete p;
                first=NULL;
                last=NULL;
            }
            first=first->next;
            last->next=first;
            x=p->data;
            delete p;
        }
        else
        {
            p=first;
            for(int j=0; j<i-2; j++)
            {
                p=p->next;
            }
            q=p->next;
            p->next=q->next;
            x=q->data;
            delete q;
        }
        return true;
    }
    CircLinkNode<T> *Search ( const T& x ) //搜索
    {
        CircLinkNode<T> *current;
        current = first->next;
        while ( current != first && current->data != x )
            current = current->next;
        return current;
    }
    CircLinkNode<T> *Locate ( int i ) //定位
    {
        CircLinkNode<T> *p=first;
        int flag=0;
        int c=0;
        while(c<i-1)
        {
            if(p==first&&flag==1)
                break;
            p=p->next;
            flag=1;
        }
        return p;
    }
    T *getData ( int i )                                //提取
    {
        return &Locate(i)->data;
    }
    void setData ( int i, T x )  //修改
    {
        if(Locate(i)!=NULL)
        {
            Locate(i)->data=x;
        }
    }
    int Length() const           //计算链表长度
    {
        int c=0,flag=0;
        CircLinkNode<T> *p=first;
        if(p==NULL)
            return 0;
        while(p!=first||flag==0)
        {
            c++;
            p=p->next;
            flag=1;
        }
        return c;
    }
    bool IsEmpty() //判表空否
    {
        if(first==NULL&&last==NULL)
            return true;
        return false;
    }
    CircLinkNode<T> *getHead() const //返回表头结点地址
    {
        return first;
    }
    void setHead ( CircLinkNode<T> *p ) //设置表头结点地址
    {
        p->next=first;
        first=p;
    }
    friend ostream& operator<<(ostream& out, const CircList<T>& L)//输出流运算符重载
    {
        CircLinkNode<T> *p=L.first;
        for(int i=0; i<L.Length(); i++)
        {
            if(i==L.Length())
            {
                cout<<p->data;
                break;
            }
            else
                cout<<p->data<<" ";
            p=p->next;
        }
        return out;
    }
    friend istream& operator>>(istream& in, CircList<T>& L)//输入流运算符重载
    {
        T n,c=1;
        in>>n;
        while(n!=-1)
        {
            L.Insert(c++,n);
            in>>n;
        }
        return in;
    }
};
int main()
{
    CircList<int> c1;
    int m,n;
    cin>>m>>n;
    for(int i=0; i<m; i++)
    {
        c1.Insert(1,m-i);
    }
    CircLinkNode<int> *pre=NULL,*p=c1.Locate(1);
    for(int i=0;i<m-1;i++)
    {
        for(int j=1;j<n;j++)
        {
             pre=p;p=p->next;
        }
        cout<<p->data<<" ";
        pre->next=p->next;
        delete p;
        p=pre->next;
    }
    cout<<p->data<<endl;
}

你可能感兴趣的:(数据结构)