约瑟夫问题
Posted 不二小杰
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了约瑟夫问题相关的知识,希望对你有一定的参考价值。
额,直接上代码:
typedef struct Node { int data; struct Node *next; }Node; void circle_init(Node *head, const int len); void circle_kill(Node *head, int num, const int len); void circle_print(Node *head); void circle_des(Node *head); int main() { int len; int num; Node head = {0, &head}; printf("输入人数:"); scanf("%d", &len); circle_init(&head, len); circle_print(&head); printf("输入num:"); scanf("%d", &num); circle_kill(&head, num, len); //circle_des(&head); return 0; } void circle_init(Node *head, const int len) { int i = 0; Node *p = head; for(i=0; i<len; i++) { p->next = (Node *)malloc(sizeof(Node)); p = p->next; p->data = i + 1; p->next = head->next; } } void circle_kill(Node *head, int num, const int len) { Node *p = head->next; Node *temp = NULL; int left = len; int i = 0; do { num = num % left; for(i=1; i<num-1; i++) { p = p->next; } temp = p->next; p->next = temp->next; p = temp->next; printf("%d ", temp->data); free(temp); left -= 1; }while(left != 1); printf("%d ", p->data); free(p); head->next = head; } void circle_print(Node *head) { Node *p = head->next; printf("链表:\n"); do { printf("%d ", p->data); p = p->next; }while(p != head->next); printf("\n"); } void circle_des(Node *head) { Node *p = head->next; Node *temp = NULL; do { temp = p->next; free(p); p = temp; }while(p->next != head->next); free(p); head->next = head; }
以上是关于约瑟夫问题的主要内容,如果未能解决你的问题,请参考以下文章