#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
今日推荐
周排行