设编号1,2…..n的n个人围坐在一圈,任选一个正整数作为报数的上限值,从第k个人开始按顺时针报数,数到m的那个人出局,他的顺时针方向下一位又从1开始报数,数到m的那个人又出局,以此类推,直到所有人出局为止,请用链表写一个函数找出每轮的幸存者。(假设n个人已经插入链表)
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- struct node
- {
- int num;
- struct node *next;
- };
- typedef struct node Node;
- typedef Node* Link;
- void create_link(Link *head)
- {
- *head = (Link)malloc(sizeof(Node));
- if(*head == NULL)
- {
- printf("malloc error!\n");
- exit(1);
- }
- (*head)->next = *head;
- (*head)->num = 0;
- }
- void insert_link(Link *head,Link *newnode)
- {
- Link temp = (*head)->next;
- while(temp->next != *head)
- {
- temp = temp->next;
- }
- (*newnode)->next = temp->next;
- temp->next = *newnode;
- ((*head)->num)++;
- }
- void delete(Link *head,int i)
- {
- if((*head)->next == *head)
- {
- return ;
- }
- Link ptr = *head;
- Link temp = (*head)->next;
- while(temp != *head)
- {
- if(temp->num == i)
- {
- ptr->next = temp->next;
- free(temp);
- temp = NULL;
- ((*head)->num)--;
- return ;
- }
- ptr = temp;
- temp = temp->next;
- }
- }
- void print(Link head)
- {
- Link temp = head->next;
- while(temp != head)
- {
- printf("%d\n",temp->num);
- temp = temp->next;
- }
- return ;
- }
- void handle(int m,int k,Link *head)
- {
- int flag = 1;
- if((*head)->next == *head || (*head)->next->next == *head)
- {
- printf("already done!\n");
- return ;
- }
- Link temp = *head;
- for(; k > 0; k--)
- {
- temp = temp->next;
- if(temp == *head)
- {
- temp = temp->next;
- }
- }
- while((*head)->num > 1)
- {
- if(temp == *head)
- {
- temp = temp->next;
- }
- if(flag == m)
- {
- Link dtmp = temp;
- printf("delete num:%d\n",dtmp->num);
- delete(head,dtmp->num);
- flag = 1;
- temp = temp->next;
- continue;
- }
- flag++;
- temp = temp->next;
- }
- return ;
- }
- int main()
- {
- int n;
- int k;
- int m;
- int i;
- Link head;
- Link newnode;
- printf("Please input n:\n");
- scanf("%d",&n);
- printf("Please input m:\n");
- scanf("%d",&m);
- printf("Please input k:\n");
- scanf("%d",&k);
- create_link(&head);
- for(i = 1; i <= n; i++)
- {
- newnode = (Link)malloc(sizeof(Node));
- if(newnode == NULL)
- {
- printf("malloc error!\n");
- exit(1);
- }
- newnode->num = i;
- insert_link(&head,&newnode);
- }
- handle(m,k,&head);
- print(head);
- return 0;
- }