约瑟夫问题(C++面向对象--单循环链表实现)

本代码只实现了单循环链表的部分操作
参考教材:数据结构(面向对象方法与 C++ 语言描述)(第二版)

//约瑟夫问题(C++面向对象--单循环链表实现)
#include<iostream>
#include<cstdlib>
using namespace std;

template<class T>
struct CircleLinkNode {
    T data;
    CircleLinkNode<T> *link;
    CircleLinkNode<T>(CircleLinkNode<T>*ptr=NULL):link(ptr) {};
    CircleLinkNode<T>(T x,CircleLinkNode<T>*ptr=NULL):data(x),link(ptr) {};
};

template<class T>
class CircleList {
    public:
        CircleList();
        CircleList(T x);//复制构造函数
        bool Insert(T &x);//尾插法插入
        bool Remove(T &x);
        CircleLinkNode<T> *getHead() const {
            return first;
        };
        CircleLinkNode<T> *Locate(int i);
        void output();
    protected:
        CircleLinkNode<T> *first;
        CircleLinkNode<T> *last;
};//定义类

template<class T>
CircleList<T>::CircleList(){
    first = new CircleLinkNode<T>;
    first->link = first;
    last = first;
}

template<class T>
CircleList<T>::CircleList(T x){
    first = new CircleLinkNode<T>(x);
    first->link = first;
    last = first;
}

template<class T>
bool CircleList<T>::Insert(T &x) {
    CircleLinkNode<T> *newNode = new CircleLinkNode<T>(x);
    if(newNode == NULL) {
        cout<<"内存分配错误!\n";
        return false; 
    }
    newNode->link = last->link;
    last->link = newNode;
    last = newNode;
    return true;
}

template<class T>
bool CircleList<T>::Remove(T &x) {
    CircleLinkNode<T> *cur = first->link;
    while(cur->link->data != x){
        cur = cur->link;
    }
    CircleLinkNode<T> *tmp = cur->link;
    cur->link = tmp->link;
    delete tmp;
    return true;
}

template<class T>
CircleLinkNode<T> *CircleList<T>::Locate(int i){
    if(i<=0) return NULL;
    CircleLinkNode<T> *cur = first;
    for(int k=1;k<i;k++){
        if(cur == NULL) break;
        else cur = cur->link;
    }
    return cur;
}

template<class T>
void solveJosephus(CircleList<T> &CL,int n,int m) {
    CircleLinkNode<T> *cur = CL.Locate(1),*pre= NULL;
    for(int i=0; i<n-1; i++) {
        for(int j=1; j<m; j++) {
            pre = cur;
            cur = cur->link;
        }
        cout<<"出队的人是:"<<cur->data<<endl;
        pre->link = cur->link;
        delete cur;
        cur = pre->link;
    }
    cout<<endl<<"胜出的人是:"<<cur->data<<endl; 
}

template<class T>
void CircleList<T>::output(){
    CircleLinkNode<T> *cur = first->link;
    while(cur!=first){
        cout<<cur->data<<" ";
        cur = cur->link ;
    }
}

int main() {
    CircleList<int> josephus(1);
    int n,m;
    cout<<"请输入数据的个数和循环的个数"<<endl;
    cin>>n>>m;
    for(int i=2; i<=n; i++){
        josephus.Insert(i);
    }
    josephus.output();
    solveJosephus(josephus,n,m) ;
    return 0;
}

版权声明:本文为dream_three原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。