约瑟夫问题_顺序表求解

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

}

猜你喜欢

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