首页 > 代码库 > 约瑟夫环 c++ 循环输入

约瑟夫环 c++ 循环输入

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
#include<iostream>
#include<string.h>
#include<cstdio>
#include <sstream>
using namespace std;
template <class T>
class joseph
{
    struct node
    {
        T data;
        node * next;
        node():next(NULL) {}
        node(T d):data(d),next(NULL) {}
    };
private:
    node * head;
    node * cur;
    node * pre;
 
public:
    joseph(T d);
    int len = 0;
    void setValue(T d)
    {
        node * tem = new node(d);
        cur ->next = tem;
        tem -> next = head;
        cur = cur -> next;
        pre = pre -> next;
        len++;
    }
    void out()
    {
        pre -> next = cur -> next;
        cout<<cur -> data<<" ";
        delete cur;
        cur = pre -> next;
        len--;
    }
    void nextmove()
    {
        cur  = cur -> next;
        pre = pre -> next;
    }
    void init()
    {
        cur = cur -> next;
        pre = pre -> next;
    }
 
};
//模板函数:将string类型变量转换为常用的数值类型(此方法具有普遍适用性)
template <class Type>
Type stringToNum(const string& str)
{
    istringstream iss(str);
    Type num;
    iss >> num;
    return num;
}
 
template <class T>
joseph<T> :: joseph(T d)
{
    head = new node(d);
    node * fz = new node();
    cur = head;
    pre = fz;
    pre -> next = head;
}
int main()
{
    while(1)//总的循环
    {
        string z,x;
        cout<<"请输入n个人"<<endl;
        cout<<"请输入密码m"<<endl;
        while(cin>>z,cin>>x)
        {
            int a = 1 ;//为第一个节点赋值而创建的
            int j = 0 ;//j为n的输入判断因子,当j=1时说明输入的n不是int型
            int k = 0 ;//k为m的输入判断因子,当j=1时说明输入的n不是int型
            joseph<int> dusk(a);//创建第一个节点,并调用构造函数把第一个节点赋值为1
            dusk.len++;//链表长度加一
            int n , m ;//n为人数,m为密码
            for(int i = 0 ; i < z.length() ; i++)//判断n是不是int型
            {
                if(z[i]<‘0‘||z[i]>‘9‘)
                {
                    cout<<"n input error"<<endl;
                    j = 1;
                    break;
                }
            }
            n = stringToNum<int>(z);//调用函数把string型的n转换成int型
            for(int i = 0 ; i < x.length() ; i++)//判断m是不是int型
            {
                if(x[i]<‘0‘||x[i]>‘9‘)
                {
                    cout<<"m input error"<<endl;
                    k=1;
                    break;
                }
            }
            m = stringToNum<int>(x);//调用函数把string型的m转换成int型
            if(k==1||j==1)break;//判断因子有一个等于1说明:n,m有一个输入的不是int型,结束循环
 
            for(int i = 2 ; i <= n ; i++)//初始化赋值
            {
                dusk.setValue(i);
            }
            dusk.init();//把cur指针指向head,把pre的next指向cur
            while(dusk.len!=0)//长度不为0时循环
            {
                for(int i = 1 ; i < m ; i++)//移动
                {
                    dusk.nextmove();
                }
                dusk.out();
            }
            cout<<endl;
        }
    }
}