带密码的约瑟夫环,密码为再数的人的个数,输出出列人的顺序,C语言实现
时间: 2024-04-08 16:29:11 浏览: 16
以下是使用C语言实现带密码的约瑟夫环的代码:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int number;
char name[20];
int password;
struct Node* next;
} Node;
Node* createNode(int number, char* name, int password) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->number = number;
strcpy(newNode->name, name);
newNode->password = password;
newNode->next = NULL;
return newNode;
}
void insertNode(Node** head, Node* newNode) {
if (*head == NULL) {
*head = newNode;
newNode->next = *head;
} else {
Node* temp = *head;
while (temp->next != *head) {
temp = temp->next;
}
temp->next = newNode;
newNode->next = *head;
}
}
void deleteNode(Node** head, Node* delNode) {
if (*head == NULL) {
return;
}
Node* curr = *head;
Node* prev;
while (curr->next != *head && curr != delNode) {
prev = curr;
curr = curr->next;
}
if (curr == delNode) {
if (curr == *head) {
*head = curr->next;
}
prev->next = curr->next;
free(curr);
}
}
void josephus(int n, int m) {
Node* head = NULL;
// 创建循环链表
for (int i = 1; i <= n; i++) {
char name[20];
sprintf(name, "Person %d", i);
insertNode(&head, createNode(i, name, i));
}
Node* curr = head;
while (n > 1) {
// 寻找要删除的节点
for (int i = 1; i < m; i++) {
curr = curr->next;
}
printf("出列人的编号:%d, 姓名:%s\n", curr->number, curr->name);
Node* nextNode = curr->next;
deleteNode(&head, curr);
curr = nextNode;
m = curr->password; // 更新报数上限值
n--; // 更新人数
}
printf("最后出列人的编号:%d, 姓名:%s\n", curr->number, curr->name);
free(curr);
}
int main() {
int n, m;
printf("请输入人数:");
scanf("%d", &n);
printf("请输入初始报数上限值:");
scanf("%d", &m);
josephus(n, m);
return 0;
}
```
你可以根据需要修改节点的数据项和链表的创建、插入、删除等操作。运行程序后,会依次输出每个出列人的编号和姓名,并最后输出最后一个出列人的编号和姓名。