#include <stdio.h> #include <string.h> #define N 100 /* 约瑟夫圆环: 利用循环链表,不需要头指针。 因为报号的人需要退出圆环,即需要再循环链表中实现删除节点的操作; */ typedef struct LNode { int number,mima; LNode *next; }LNode,*LinkList; //定义循环链表结点类型。(数据方面只需要含一个每人的一个编号和一个number) void Creat(LinkList &L,int n) { L=new LNode; LinkList e=L; for(int i=0;i<n;i++) { LinkList p=new LNode ; p->number=(i+1); scanf("%d",&p->mima); p->next=NULL; e->next=p; e=p; } e->next=L->next; L=L->next; } void Print(LinkList L,int n,int m) { int num=0; LinkList e=L,pre=L; while(pre->next != e) { pre=pre->next; } int t=0; while(num<n) { t++;int x=1; if(t==m) { num++; //删除结点。 printf("%d ",e->number); m=e->mima; x=0; t=0; } if(x) {pre=e;e=e->next;} else {e=e->next;pre->next=e;} } } int main() { int m,n; LinkList L;L=NULL; printf("请输入一共拥有的人数:(当n为0的时候退出。)\n"); while(scanf("%d",&n)!=EOF && n) { printf("请输入每个人的密码:\n"); Creat(L,n); printf("请输入m的初值:\n");scanf("%d",&m); Print(L,n,m); printf("\n"); printf("请输入一共拥有的人数:(当n为0的时候退出。)\n"); } return 0; }