用循环链表实现约瑟夫环

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 typedef struct node{
 4     int number;
 5     struct node * next;
 6 }node;
 7 node * initLink(int n){
 8     node * head=(node*)malloc(sizeof(node));
 9     head->number=1;
10     head->next=NULL;
11     node * temp=head;
12     for (int i=2; i<=n; i++) {
13         node * p=(node*)malloc(sizeof(node));
14         p->number=i;
15         p->next=NULL; 
16         temp->next=p;
17         temp=temp->next;
18     }
19     temp->next=head;//首尾相连,组成循环链表 
20     return head;
21 }
22 
23 void find(node * head,int k,int m){
24 
25     node * temp=head;
26     //找到链表第一个结点的上一个结点,为删除操作做准备
27     while (temp->next!=head) {
28         temp=temp->next;
29     }
30    node * p=head;
31     while (p->number!=k) {
32         temp=p;
33         p=p->next;
34     }
35     //找到编号为k的人
36     while (p->next!=p) {
37         //找到从p报数1开始,报m的人,并且还要知道数m-1de人的位置tail,方便做删除操作。
38         for (int i=1; i<m; i++) {
39             temp=p;
40             p=p->next;
41         }
42         temp->next=p->next;//删除p结点
43         printf("出列人的编号为:%d\n",p->number);
44         free(p);
45         p=temp->next;//继续使用p指针指向出列编号的下一个编号,游戏继续
46     }
47     printf("出列人的编号为:%d\n",p->number);
48     free(p);
49 }
50 
51 int main() {
52     int n,k,m; 
53     printf("输入圆桌上的人数n:");
54     scanf("%d",&n);
55     node* head=initLink(n);
56     printf("从第k人开始报数(k>1且k<%d):",n);
57     scanf("%d",&k);
58     printf("数到m的人出列:");
59     scanf("%d",&m);
60     find(head, k, m);
61     return 0;
62 }

猜你喜欢

转载自www.cnblogs.com/AQhhhh/p/10659768.html