用循环链表实现约瑟夫环
约瑟夫问题:
#include <stdio.h> #include <stdlib.h> typedef struct node{ int data; struct node * next; }node; //创建一个有n个结点的循环链表 node * initLink(int n){ node * head=(node*)malloc(sizeof(node)); node * temp=head; for (int i=1; i<=n; i++) { node * p=(node*)malloc(sizeof(node)); p->data=i; p->next=NULL; temp->next=p; temp=p; } temp->next=head->next;//首尾相连,组成循环链表,去掉了头结点head free(head); return temp->next; } void find(node * head,int m){ node * temp; node * p=head; while (p->next!=p) { //找到从报数1开始,报m的人 for (int i=1; i<m-1; i++) { p=p->next; } //此时p是要删除的结点的前一个结点 temp = p->next; p->next=temp->next; p = p->next;//继续使用p指针指向出列编号的下一个编号,游戏继续 printf("出列人的编号为:%d\n",temp->data); free(temp); } printf("出列人的编号为:%d\n",p->data); } int main() { int n,m; printf("输入圆桌上的人数n:"); scanf("%d",&n); node* head=initLink(n); printf("数到m的人出列:"); scanf("%d",&m); find(head, m); return 0; }