约瑟夫环

来源:互联网 发布:企业融资方式 知乎 编辑:程序博客网 时间:2024/05/19 23:56

编号1,2…..n的n个人围坐在一圈,任选一个正整数作为报数的上限值从第k个人开始顺时针报数数到m的那个人出局他的顺时针方向下一位又从1开始报数数到m那个人又出局以此类推直到所有人出局为止请用链表写一个函数找出每轮的幸存者(假设n个人已经插入链表

[csharp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <string.h>  
  4.   
  5. struct node  
  6. {  
  7.     int num;  
  8.     struct node *next;  
  9. };  
  10.   
  11. typedef struct node Node;  
  12. typedef Node* Link;  
  13.   
  14. void create_link(Link *head)  
  15. {  
  16.     *head = (Link)malloc(sizeof(Node));  
  17.     if(*head == NULL)  
  18.     {  
  19.         printf("malloc error!\n");  
  20.     exit(1);  
  21.     }  
  22.     (*head)->next = *head;  
  23.     (*head)->num = 0;  
  24. }  
  25.   
  26. void insert_link(Link *head,Link *newnode)  
  27. {  
  28.     Link temp = (*head)->next;  
  29.   
  30.     while(temp->next != *head)  
  31.     {  
  32.         temp = temp->next;  
  33.     }  
  34.   
  35.     (*newnode)->next = temp->next;  
  36.     temp->next = *newnode;  
  37.   
  38.     ((*head)->num)++;  
  39. }  
  40.   
  41. void delete(Link *head,int i)  
  42. {  
  43.     if((*head)->next == *head)  
  44.     {  
  45.         return ;  
  46.     }  
  47.     Link ptr = *head;  
  48.     Link temp = (*head)->next;  
  49.   
  50.     while(temp != *head)  
  51.     {  
  52.         if(temp->num == i)  
  53.     {  
  54.         ptr->next = temp->next;  
  55.         free(temp);  
  56.         temp = NULL;  
  57.         ((*head)->num)--;  
  58.         return ;  
  59.     }  
  60.     ptr = temp;  
  61.         temp = temp->next;  
  62.     }  
  63. }  
  64.   
  65. void print(Link head)  
  66. {  
  67.     Link temp = head->next;  
  68.     while(temp != head)  
  69.     {  
  70.         printf("%d\n",temp->num);  
  71.         temp = temp->next;  
  72.     }  
  73.     return ;  
  74. }  
  75.   
  76. void handle(int m,int k,Link *head)  
  77. {  
  78.     int flag = 1;  
  79.       
  80.     if((*head)->next == *head || (*head)->next->next == *head)  
  81.     {  
  82.         printf("already done!\n");  
  83.         return ;  
  84.     }  
  85.   
  86.     Link temp = *head;  
  87.     for(; k > 0; k--)  
  88.     {  
  89.         temp = temp->next;  
  90.     if(temp == *head)  
  91.     {  
  92.         temp = temp->next;  
  93.     }  
  94.     }  
  95.   
  96.     while((*head)->num > 1)  
  97.     {  
  98.         if(temp == *head)  
  99.     {  
  100.         temp = temp->next;  
  101.     }  
  102.     if(flag == m)  
  103.     {  
  104.         Link dtmp = temp;  
  105.         printf("delete num:%d\n",dtmp->num);  
  106.         delete(head,dtmp->num);  
  107.         flag = 1;  
  108.         temp = temp->next;  
  109.         continue;  
  110.     }  
  111.     flag++;  
  112.     temp = temp->next;  
  113.     }  
  114.   
  115.     return ;  
  116.   
  117. }  
  118.   
  119. int main()  
  120. {  
  121.     int n;  
  122.     int k;  
  123.     int m;  
  124.     int i;  
  125.     Link head;  
  126.     Link newnode;  
  127.       
  128.     printf("Please input n:\n");  
  129.     scanf("%d",&n);  
  130.     printf("Please input m:\n");  
  131.     scanf("%d",&m);  
  132.     printf("Please input k:\n");  
  133.     scanf("%d",&k);  
  134.   
  135.     create_link(&head);  
  136.   
  137.     for(i = 1; i <= n; i++)  
  138.     {  
  139.         newnode = (Link)malloc(sizeof(Node));  
  140.     if(newnode == NULL)  
  141.     {  
  142.         printf("malloc error!\n");  
  143.         exit(1);  
  144.     }  
  145.     newnode->num = i;  
  146.     insert_link(&head,&newnode);  
  147.     }  
  148.     handle(m,k,&head);  
  149.     print(head);  
  150.   
  151.     return 0;  
  152. }  
0 0
原创粉丝点击