约瑟夫环问题(顺序表)——C++实现

来源:互联网 发布:cctv下载网络电视下载 编辑:程序博客网 时间:2024/05/19 11:50
#include<iostream>#include<malloc.h>#define MAXSIZE 100//人数上限using namespace std;typedef int DataType;typedef struct{DataType data[MAXSIZE];//存放编号的数组int length; //人数}SeqList,* PSeqList;int main(){/*函数声明*/void panduan(PSeqList L);PSeqList Init_SeqList(void);void Delete_SeqList(PSeqList L,int i);void josephus_SeqList(PSeqList L,int s,int m);PSeqList L=Init_SeqList();//创建环int s;//起始序号int m;//计数值cout<<"请输入约瑟夫环的起始序号s和计数值m的值分别是:";cin>>s>>m;josephus_SeqList(L,s,m);//约瑟夫序列算法return 0;}/*判断顺序表是否存在或溢出*/void panduan(PSeqList L){if(!L){cout<<"表不存在!";return;}if(L->length>=MAXSIZE){cout<<"表溢出!";return;}}/*创建顺序表*/PSeqList Init_SeqList(void){PSeqList L;L=(PSeqList)malloc(sizeof(SeqList));cout<<"输入约瑟夫环的人数(不超过100):";cin>>L->length;cout<<"输入每个人的小名:";for(int i=0;i<L->length;i++){cin>>L->data[i];}return L;}/*删除顺序表第i个元素*/void Delete_SeqList(PSeqList L,int i){panduan(L);if(i<1 || i>L->length+1){cout<<"删除位置不合法!";return;}for(int j=(i-1);j<L->length;j++){L->data[j]=L->data[j+1];}L->length--;}/*约瑟夫序列算法*/void josephus_SeqList(PSeqList L,int s,int m){int j=1;panduan(L);int s1=s-1; //第s个人对应的数组下标cout<<"\n\n输出约瑟夫序列:\n\n";for(int i=L->length;i>0;i--){s1=(s1+m-1)%i;//出列人的下标cout<<"第"<<j++<<"个出列的人是:"<<L->data[s1]<<endl;Delete_SeqList(L,s1+1);//在数组中删除出列人}}

0 0
原创粉丝点击