#include<stdio.h>#include<stdlib.h>typedefstructnode//结构体{int id;int password;structnode*next;}LNode,*Linklist;voidPrintList(Linklist L,int n)//打印循环链表数据{int i;printf("--ID-- --PASSWORD--\n");for(i =0;i < n;i ++){printf("%3d %9d\n",L -> id,L -> password);
L = L -> next;}}
Linklist ListCreat(int n)//创建循环单链表{int i;
Linklist H =(Linklist)malloc(sizeof(LNode));
H -> next =NULL;printf("请输入第1个人的密码:");scanf("%d",&H -> password);
H -> id =1;
LNode *s,*rear = H;for(i =2;i <= n;i ++){
s =(Linklist)malloc(sizeof(LNode));
s -> id = i;
rear -> next = s;
rear = s;
rear -> id = i;printf("请输入第%d个人的密码:",i);scanf("%d",&rear -> password);}
rear -> next = H;return H;}
Linklist Listsreach(Linklist L,int i)//找到第i个结点{
LNode *p = L;int j =0;while(p -> next !=NULL&& j < i){
p = p -> next;
j ++;}if(j == i)return p;elsereturnNULL;}voidJosephusOperate(Linklist L,int m,int n)//约瑟夫问题求解{int num;int count =0;int flag =1;
LNode *r =NULL;
LNode *s =NULL;
LNode *del =NULL;
L =Listsreach(L,num -1);
s = r = L;while(r -> next != L){
r = r -> next;}while(flag){for(count =1;count < m;count ++){
r = s;
s = s -> next;}if(r == s){
flag =0;}
del = s;
r -> next = s -> next;
s = s -> next;
m = del -> password;printf("删除数据为第%d个人:密码为%d\n",del -> id,del -> password);free(del);}
L =NULL;}voidmain(){
Linklist L;//约瑟夫环头节点int n,m;printf("请输入人数n:");scanf("%d",&n);printf("请输入初始密码m:");scanf("%d",&m);
L =ListCreat(n);//第一个数据的结点printf("----打印循环列表----\n");PrintList(L,n);JosephusOperate(L,m,n);}