数据结构约瑟夫c语言
时间: 2023-11-04 08:07:12 浏览: 122
C语言数据结构 约瑟夫
约瑟夫问题是一个经典的问题,描述如下:有n个人围成一圈,从第一个人开始报数,报到m的人出圈,剩下的人继续从1开始报数,直到剩下最后一个人。在C语言中,可以使用循环链表来解决约瑟夫问题。具体实现方法如下:
1. 创建循环链表结构体变量,包括数据域和指针域。
2. 初始化链表,创建头结点并将其next指针指向NULL。
3. 构建循环链表,使用Push函数向链表中插入新结点,同时让尾结点tail指向新结点,形成循环链表。
4. 解决约瑟夫问题,使用循环链表模拟报数和出圈的过程,直到只剩下一个人为止。
下面是一个简单的C语言代码实现:
```
#include <stdio.h>
#include <stdlib.h>
typedef struct Node{
int data;
struct Node* next;
}Node;
Node* Create(){
Node* head;
head = (Node*)malloc(sizeof(Node));
if (head == NULL) {
exit(1);
}
head->next = NULL;
return head;
}
Node* Push(Node* head, Node* tail, int i){
Node* p;
p = (Node*)malloc(sizeof(Node));
if (p == NULL) {
exit(1);
}
p->data = i;
tail->next = p;
p->next = head->next;
tail = p;
return head;
}
int main(){
int n, m;
printf("请输入总人数n和报数m:");
scanf("%d%d", &n, &m);
Node* head, * tail, * p, * q;
head = Create();
tail = head;
for (int i = 1; i <= n; i++) {
tail = Push(head, tail, i);
}
p = head->next;
while (p != p->next) {
for (int i = 1; i < m - 1; i++) {
p = p->next;
}
q = p->next;
p->next = q->next;
printf("%d出圈\n", q->data);
free(q);
p = p->next;
}
printf("最后留下的是%d\n", p->data);
free(p);
free(head);
return 0;
}
```
阅读全文