1. 程式人生 > >約瑟夫問題_單項迴圈連結串列求解

約瑟夫問題_單項迴圈連結串列求解

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



}