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
今日推荐
周排行