c语言链表实现约瑟夫
时间: 2023-10-24 15:06:34 浏览: 118
利用链表实现约瑟夫问题
5星 · 资源好评率100%
循环链表是一种链表的变体,它的最后一个节点指向第一个节点,形成一个闭环。在C语言中,可以使用循环链表来实现约瑟夫环。循环链表的创建与操作步骤如下所示:
1. 定义循环链表的节点结构体,包含数据域和指向下一个节点的指针。
2. 创建一个头节点,并将其指针指向自身,表示链表为空。
3. 根据输入的数据创建其他节点,并通过指针连接起来形成循环链表。
4. 遍历链表,找到要删除的节点,并将其前一个节点的指针指向下一个节点。
5. 重复以上步骤,直到链表中只剩下一个节点。
下面是使用循环链表实现约瑟夫环的C语言代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义循环链表的节点结构体
typedef struct Node {
int data;
struct Node* next;
} Node;
// 创建循环链表
Node* createCircularLinkedList(int n) {
if (n <= 0) {
return NULL;
}
Node* head = (Node*)malloc(sizeof(Node));
head->data = 1;
head->next = NULL;
Node* prev = head;
for (int i = 2; i <= n; i++) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = i;
newNode->next = NULL;
prev->next = newNode;
prev = newNode;
}
prev->next = head; // 最后一个节点指向头节点,形成循环
return head;
}
// 删除节点,并返回下一个节点
Node* deleteNode(Node* node) {
Node* nextNode = node->next;
node->next = nextNode->next;
free(nextNode);
return node->next;
}
// 约瑟夫环问题的求解
void josephusProblem(int n, int m) {
Node* head = createCircularLinkedList(n);
Node* current = head;
while (current->next != current) {
for (int i = 1; i < m - 1; i++) {
current = current->next;
}
current = deleteNode(current);
}
printf("最后剩下的节点: %d\n", current->data);
free(current);
}
int main() {
int n = 10; // 节点个数
int m = 3; // 每次删除的间隔
josephusProblem(n, m);
return 0;
}
```
阅读全文