澳门一肖一码必中一肖一码6_最新资讯→点击查看更多

安卓 admin 2025-03-29 02:54 5 0

约瑟夫问题,又称约瑟夫环,是一个经典的数学问题,涉及到一个环形队列,每次从队列中删除第 个人,直到队列中只剩下一个人。下面是用 C 语言解决约瑟夫问题的示例代码:

#include <stdio.h>
#include <stdlib.h>

// 定义链表节点香港澳门今晚开奖结果详情查询网站下载
typedef struct Node {
    int data;
    struct Node *next;
} Node;

// 创建一个具有 n 个节点的循环链表
Node* createCircularLinkedList(int n) {
    Node *head = NULL;
    Node *prev = NULL;
    
    for (int i = 1; i <= n; i++) {
        Node *newNode = (Node *)malloc(sizeof(Node));
        newNode->data = i;
        
        if (head == NULL) {
     &新澳门管家婆100精准nbsp;      head = newNode;
        } else {
            prev->next = newNode;
        }
        
        newNode->next = head;
        prev = newNode;
    }
    
    return head;
}

// 在循环链表中删除第 m 个节点
Node* removeMthNode(Node *head, int m) {
    if (head == NULL) {
        printf("链表为空\\n");
 &澳门管家婆一肖一码一中一持nbsp;      return NULL;
    }
    
    Node *current = head;
    Node *prev = NULL;
    
    // 移动到待删除节点的前一个节点
    for (int i = 1; i < m; i++) {
        prev = current;
        current = current->next;
    }
    
    // 删除节点
    if (prev != NULL) {
        prev->next = current->next;
    } else {
        head = current->next;
    }
    
    printf("出列的编号:%d\\n", current->data);
    free(current);
    
    return head;
}

int main() {
    int n, m;
    printf("请输入总人数 n 和每次删除的第 m 个人:");
    scanf("%d %d", &n, &m);
    
    Node *head = createCircularLinkedList(n);
    
    while (head != head->next) {
        head = removeMthNode(head, m);
    }
    
    printf("最后留下的人的编号:%d\\n", head->data);
    
    free(head);
    
    return 0;
}

这段代码首先创建了一个循环链表,表示人们围成的环。然后,根据输入的每次删除第 个人,逐步移除节点,直到链表中只剩下一个节点为止,即找到了最后留下的人。请注意,这只是一个基本示例,实际应用中可能需要更多的错误检查和优化。