实验任务 N个人围成一圈,从第1个人开始顺序报数,1,2。凡报到2者,退出圈子,找出最后留在圈子中的人原来的序号。要求用链表实现。 输入描述 输入的数据有多组,每组第一个数为N,接下来N个数为一圈人

任务描述
任务讲解
查看答案
实验任务
N个人围成一圈,从第1个人开始顺序报数,1,2。凡报到2者,退出圈子,找出最后留在圈子中的人原来的序号。要求用链表实现。

输入描述
输入的数据有多组,每组第一个数为N,接下来N个数为一圈人的序号(N<100)。

输出描述
输出最后留在圈子里的人原来的编号。

输入样例
1 1

2 1 2

3 1 2 3

输出样例
1

1

3

提示
用链表实现!

题目来源
谭浩强《C程序设计(第五版)》习9.6

内存限制:128mb 时间限制:1000ms
开始你的实验吧,祝你成功!

#include 
#include 

typedef struct Node {
    int data;
    struct Node* next;
} Node;

Node* createList(int arr[], int n) {
    if (n == 0) return NULL;
    Node* head = (Node*)malloc(sizeof(Node));
    head->data = arr[0];
    Node* current = head;
    for (int i = 1; i < n; i++) {
        current->next = (Node*)malloc(sizeof(Node));
        current = current->next;
        current->data = arr[i];
    }
    current->next = head; // 形成循环链表
    return head;
}

Node* josephus(Node* head) {
    if (head == NULL) return NULL;
    if (head->next == head) {
        head->next = NULL; // 断开循环
        return head;
    }

    Node* prev = head;
    while (prev->next != head) {
        prev = prev->next;
    }

    Node* current = head;
    int count = 0;

    while (current->next != current) {
        count++;
        if (count == 2) {
            // 删除当前节点
            prev->next = current->next;
            Node* temp = current;
            current = current->next;
            free(temp);
            count = 0;
        } else {
            prev = current;
            current = current->next;
        }
    }

    current->next = NULL; // 断开循环
    return current;
}

void freeList(Node* head) {
    Node* temp;
    while (head != NULL) {
        temp = head;
        head = head->next;
        free(temp);
    }
}

int main() {
    int N;
    while (scanf("%d", &N) != EOF) {
        int arr[100];
        for (int i = 0; i < N; i++) {
            scanf("%d", &arr[i]);
        }
        Node* head = createList(arr, N);
        Node* survivor = josephus(head);
        printf("%d\n", survivor->data);
        freeList(survivor);
    }
    return 0;
}

你可能感兴趣的:(链表,算法,数据结构)