#include "stdio.h"
#include "stdlib.h"
typedef struct node{
int data;
struct node *next;
}LNode,*LinkList;
//创建一个不带头结点的单向循环链表 并且赋值
LinkList CreatCycleList(int num)
{
int i=1;
LinkList head=NULL,q=NULL,p=NULL;
head=(LinkList)malloc(sizeof(LNode));
head->data=0;
head->next=NULL;
p=head;
while(i<num)
{
q=(LinkList)malloc(sizeof(LNode));
q->data=i;
q->next=NULL;
p->next=q;
p=q;
i++;
}
p->next=head;
return head;
}
int josephus_LinkList (LinkList josephus_Link, int s, int m)//求约瑟夫问题的出列元素序列,入口参数:已经存放数据的链表头指针的地址,
//起始位置s,数m ,出口参数:1表示成功,0表示表中没有元素
{
LinkList p,pre; /*p指向当前结点,pre指向其前驱结点*/
int count;
if(!josephus_Link)
{
printf("not exist");
return 0;
}
/*找第s个元素*/
p= josephus_Link;
for(count=1;count<s;count++) /*查找第s个结点,用p作为第s个结点的指针*/
p=p->next;
printf("输出约瑟夫序列:");
while ( p!=p->next) /*输出 n-1个元素个结点*/
{
for(count=1;count<m;count++)
{ pre=p;
p=p->next;
}
printf("%d\t", p->data);
pre->next=p->next;
free(p);
p=pre->next;
}
printf("%d\t",p->data); /*输出最后一个元素个结点*/
free(p);
return 1;
}
void Display(LinkList head)
{
LinkList p=head;
printf("创建的循环链表为:\n");
while(p->next!=head)
{
printf("%d\t",p->data);
p=p->next;
}
printf("%d\n",p->data);
}
void main()
{
int s,m;
LinkList head=CreatCycleList(9); //创建一个长度为9的循环链表
Display(head);
printf("请输入起始位置的数组下标(从0开始):\n");
scanf("%d",&s);
printf("请输入计数步长:\n");
scanf("%d",&m);
josephus_LinkList(head,s,m);
printf("\n");
}