数据结构约瑟夫环课程设计c语言编写
时间: 2025-06-16 14:26:19 浏览: 14
### 约瑟夫环 数据结构 课程设计 C语言 实现
约瑟夫环是一种经典的数学问题,通常可以通过数据结构中的循环链表或顺序表来实现。以下是一个基于C语言的约瑟夫环实现代码,使用单向循环链表模拟该过程,并按照出列的顺序打印各人的编号。
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node* next;
} Node;
void createCircle(Node** head, int N) {
*head = (Node*)malloc(sizeof(Node));
if (!(*head)) {
printf("内存分配失败\n");
return;
}
(*head)->data = 1;
(*head)->next = *head;
Node* p = *head;
for (int i = 2; i <= N; i++) {
Node* newNode = (Node*)malloc(sizeof(Node));
if (!newNode) {
printf("内存分配失败\n");
return;
}
newNode->data = i;
newNode->next = (*head);
p->next = newNode;
p = newNode;
}
}
void josephusCircle(Node* head, int M) {
Node* p = head;
Node* q = NULL;
while (p->next != p) {
for (int i = 1; i < M; i++) {
q = p;
p = p->next;
}
q->next = p->next;
printf("%d ", p->data);
free(p);
p = q->next;
}
printf("%d\n", p->data);
free(p);
}
int main() {
int N, M;
printf("请输入总人数N和报数上限M:\n");
scanf("%d%d", &N, &M);
Node* head = NULL;
createCircle(&head, N);
josephusCircle(head, M);
return 0;
}
```
#### 代码说明
- **createCircle 函数**:创建一个包含 `N` 个节点的单向循环链表[^1]。
- **josephusCircle 函数**:模拟约瑟夫环的过程,按照指定的步长 `M` 删除节点,并输出被删除节点的编号[^2]。
- **main 函数**:从用户输入获取总人数 `N` 和报数上限 `M`,然后调用上述函数完成约瑟夫环的模拟。
此实现方式遵循了引用中提到的基本要求一,即利用单向循环链表模拟约瑟夫环的过程[^3]。
#### 注意事项
- 在实际应用中,需要确保输入的 `N` 和 `M` 是有效的正整数。
- 动态内存分配后需要及时释放以避免内存泄漏。
阅读全文
相关推荐














