1. 程式人生 > >約瑟夫問題_順序表求解

約瑟夫問題_順序表求解

#include "stdio.h"
#include "stdlib.h"
#define MAXSIZE 100

typedef struct node {

	int data[MAXSIZE];
	int length;

}SeqList,*PSeqList;				//定義一個順序表

PSeqList Init_SeqList()			//順序表初始化
{
PSeqList PL=(PSeqList)malloc(sizeof(SeqList));
if(PL)
{
PL->length=0;
return PL;
}

printf("creat error");
return NULL;

}

int Insert_SeqList(PSeqList PL,int i,int x) //順序表的插入,i為插入位置(陣列下標,從0開始,下同),x為插入數值
											//-2 表不存在,-1 溢位,0 插入位置不合法 ,1插入成功
{
int j;
if(!PL)
{
printf("not exist");
return -2;	
}
if(PL->length>=MAXSIZE)
{
printf("overflow");
return -1;
}
if(i<0||i>PL->length)
{
printf("insert illegal");
return 0;
}
for(j=PL->length-1;j>=i;j--)
PL->data[j+1]=PL->data[j];
PL->data[i]=x;
PL->length++;
return 1;

}

int Delete_SeqList(PSeqList PL,int i)  //順序表的刪除,i為刪除位置(陣列下標),返回-2 表不存在,0,刪除位置不合法,1刪除成功
{
int j;
if (!PL)
{
printf("not exist\n");
return -2;	
}

if(i<0||i>PL->length-1)
{
printf("delete illegal \n");
return 0;
}
for(j=i;j<PL->length-1;j++)
PL->data[j]=PL->data[j+1];
PL->length--;
return 1;


}

int josephus_SeqList(PSeqList josephus_seq, int s, int m)  //求解約瑟夫問題的出列元素序列入口引數:已經存放資料的順序表,
															 //起始位置s,數m ,   出口引數:1表示成功,0表示表中沒有元素
{
int s1,w,i;
if(!josephus_seq)
{
printf("not exist");
return 0;
}
s1=s;									//陣列下標
printf("輸出約瑟夫序列:");
for(i=josephus_seq->length;i>0;i--)
{
s1=(s1+m-1)%i;
w=josephus_seq->data[s1];
printf("%d\t",w);
Delete_SeqList(josephus_seq,s1);
}
return 1;

}
void main()
{
int i;
int s,m;
PSeqList list;
list=Init_SeqList();
printf("約瑟夫序列為:\n");
for(i=0;i<9;i++)                                     //順序表賦值
{
	Insert_SeqList(list,i,i);
	printf("%d\t",list->data[i]);

}
printf("\n 請輸入開始計數對應陣列下標:\n");        //輸入計數位置(陣列下標)和技術步長
scanf("%d",&s);
printf("請輸入計數步長:\n");
scanf("%d",&m);

josephus_SeqList(list,s,m);
printf("\n");

}