约瑟夫问题_单项循环链表求解

#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");



}

猜你喜欢

转载自blog.csdn.net/qqGHJ/article/details/82832575