Josephus问题

#include <stdio.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdlib.h>
#define Maxnum 100
#define FALSSE 0
#define TRUE 1


typedef int DateType;
struct SeqList
{
    int MAXNUM;
    int n;
    DateType *element;
};


typedef struct SeqList *PSeqList;




 PSeqList creatNullList_seq(int m){
    PSeqList palist =(PSeqList)malloc(sizeof(struct SeqList));
    if(palist!=NULL){
        palist->element =(DateType*)malloc(sizeof(DateType)*m);
        if(palist->element){
            palist->MAXNUM = m;
            palist->n=0;
            return palist;


        }
        else free(palist);
    }
    printf("out of space!!\n");
    return NULL;




}
int deleteP_seq(PSeqList palist,int p)
{
    int q;int u;


    for(q=p;q<=palist->n-1;q++){
        palist->element[q]=palist->element[q+1];
    }
    palist->n=palist->n-1;


    for(u=0;u<palist->n;u++)
    {
        printf("%d ",palist->element[u]);
    }
    return 1;
}


void josephus_seq(PSeqList palist,int s,int m)
{
int s1,i,w;
s1=s-1;
for(i=palist->n;i>0;i--)  //找出列的元素
  {
  s1=(s1+m-1)%i;  // 循环
 w=palist->element[s1];//求下标为s1 的元素的值
 printf("\n  Out element %d\n",w);//元素的列
 deleteP_seq(palist,s1);//删除出列的元素
 }
}


int insertPre_seq(PSeqList palist,int p,int x)
{
    int q;int u;
    if(palist->n>=palist->MAXNUM)
    {
        printf("Overflow/n");
        return 0;
    }
    if(p<0||p>palist->n)
    {
        printf("Not exit!\n");
        return 0;
    }
    for(q=palist->n-1;q>=p;q--)
    {
        palist->element[q+1]=palist->element[q];


    }
    palist->element[p]=x;
    palist->n=palist->n+1;


    for(u=0;u<palist->n;u++)
    {


    }
    return 1;
}


int main()
{
    PSeqList jos_alist;
    int i,k;
    int n,s,m;
    printf(" 请输入参与人数S:\nS=");
    scanf("%d",&n);
    printf("\n请输入第M人开始报数人:\n \nM=");
    scanf("%d",&s);
    printf("\n请输入报数第N人后出列 \nN=");
    scanf("%d",&m);
    jos_alist=creatNullList_seq(n);
    if(jos_alist!=NULL){
     for(i=0;i<n;i++)
     insertPre_seq(jos_alist,i,i+1);
     josephus_seq(jos_alist,s,m);
     free(jos_alist->element);
     free(jos_alist);
    }
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值