约瑟夫环代码错误,不知道哪里出了问题

#include
using namespace std;

typedef struct Node
{
int num;
int password;
struct Node *next;
}List;

List *create(int n)
{
List *p, *q, *head;
int i = 1;
head = new List;
p = head;
cout<<"请输入第"< cin>>p->password ;
for(i = 2;i <= n;i++)
{
q = new List;
cout<<"请输入第"< cin>>q->password ;
p->next = q;
p = p->next ;
}
p->next = head;
return head;
}

int output(List *L)
{
int m, i;
List *p = L, *q, *s;
q = p;
cout<<"请输入m的初值"< cin>>m;
cout<<"出列顺序为:"< while(q != NULL)
{
for(i = 1; i {
q = p;
p = p->next ;
}
q->next = p->next;
cout<password < m = p->password;
q = p->next ;
delete(p);
}
return 0;
}

int main()
{
List *L;
int n;
cout<<"请输入实验人数"< cin>>n;
L = create(n);
output(L);
return 0;
}

该回答引用ChatGPT

这段代码存在一些错误,以下是修复后的代码:

#include <iostream>
using namespace std;

typedef struct Node {
    int num;
    int password;
    struct Node* next;
} List;

List* create(int n) {
    List* p, * q, * head;
    int i = 1;
    head = new List;
    p = head;
    cout << "请输入第" << i << "个人的密码: ";
    cin >> p->password;
    for (i = 2; i <= n; i++) {
        q = new List;
        cout << "请输入第" << i << "个人的密码: ";
        cin >> q->password;
        p->next = q;
        p = p->next;
    }
    p->next = head;
    return head;
}

int output(List* L) {
    int m, i;
    List* p = L, * q, * s;
    q = p;
    cout << "请输入m的初值: ";
    cin >> m;
    cout << "出列顺序为:";
    while (q->next != q) {
        for (i = 1; i < m; i++) {
            s = q;
            q = p;
            p = p->next;
        }
        s->next = p->next;
        cout << p->num << " ";
        m = p->password;
        q = p->next;
        delete (p);
        p = q;
    }
    cout << q->num << endl;
    return 0;
}

int main() {
    List* L;
    int n;
    cout << "请输入实验人数: ";
    cin >> n;
    L = create(n);
    for (int i = 1; i <= n; i++) {
        L->num = i;
        L = L->next;
    }
    output(L);
    return 0;
}

这里列出了几个问题和修改方法:

  • 在 create 函数中,输入人员密码时,输出提示信息中应该是 i 而不是 <。

  • 在 output 函数中,应该将 q != NULL 修改为 q->next != q,否则最后一个节点不会被处理。

  • 在 output 函数中,每次删除一个节点后,应该将 p 指向下一个节点,而不是 q->next,因为在下一次循环中需要从 p 开始计数。

  • 在 main 函数中,应该在创建链表时为每个节点的 num 属性赋值。