#include <stdio.h> #include <malloc.h> #define N 7 //定义N=7,表示有7个链表单元 #define OVERFLOW 0 #define OK 1 typedef struct LNode{ //定义链表结构 int password; int order; struct LNode *next; }LNode,*LinkList; int PassW[N]={3,1,7,2,4,8,4}; void Joseph(LinkList p,int m,int x); //声明函数 int main() { int i,m; LinkList Lhead,p,q; //定义三个指向链表结构的指针 Lhead=(LinkList)malloc(sizeof(LNode)); //初始化头节点 if(!Lhead)return OVERFLOW; //分配空间失败返回 Lhead->password=PassW[0]; Lhead->order=1; Lhead->next=NULL; p=Lhead; for(i=1;i<7;i++){ if(!(q=(LinkList)malloc(sizeof(LNode))))return OVERFLOW; q->password=PassW[i]; //初始化循环列表中的密码值 q->order=i+1; p->next=q;p=q; //新创建一个指针节点并使p->next指向它,再使p=q } p->next=Lhead; //使p->next指向头节点,从而形成循环链表 printf("请输入第一次计数值m: \n"); scanf("%d",&m); //用户输入第一次计数值m printf("第一次计数值m= %d \n",m); Joseph(p,m,N); return OK; } void Joseph(LinkList p,int m,int x){ LinkList q; int i; if(x==0)return; //链表中没有节点的话,立即返回上一层函数 q=p; m%=x; //m对x求余,从而求出链表中的第几个单元是所求节点 if(m==0)m=x; //若m刚好可以整除x,则令m=x,因为如果m=0,则不进行下一个 //for循环,那样就无法使q指向要删除节点,p指向他的的前一节点,那样则无法进行删除操作 for(i=1;i<=m;i++){ p=q; q=p->next; //使q指向要删除的节点,p指向q的前一个节点 } p->next=q->next; //从循环链表中删除q指向的节点 i=q->password; printf("%d ",q->order); free(q); //释放q指向的空间 Joseph(p,i,x-1); }