sxswht 发表于 2016-6-16 15:59:34

约瑟夫问题

编号为1~N的N个人按顺时针方向坐一圈,每个人持有一个密码(正整数,可以自由输入),
开始人选一个正整数作为报数上限值M,从第一个人按顺时针方向自1开始顺序报数,报到M时
停止报数。报M的人出列,将他的密码作为新的M值,从他顺时针方向上的下一个人开始从1报数,
如此下去,直至所有人出列
在运行时,总会显示运行失败,求大神指导{:5_92:} {:5_92:}


#include <iostream>
#include<stdlib.h>
using namespace std;
#define ERROR 0


typedef struct node
{
        int number;
        int key;
        struct node *next;
}node,*Linklist;


Linklist intilist(int n);
int lengthlist(Linklist L);
int scanlist(Linklist L);
int gamelist(Linklist &L,int m);


Linklist intilist(int n)
{
        if(n==0)
                return NULL;
        int ikey;
        cout<<"输入第1个人的密码:";
        cin>>ikey;
        Linklist L=new node;
        L->key=ikey;
        L->number=1;
        L->next=L;
        for(int i=2;i<=n;i++)
        {
                Linklist p=new node;
                int ikey;
                cout<<"输入第"<<i<<"个人的密码:";
                cin>>ikey;
                p->key=ikey;
                p->number=i;
                p->next=L->next;
                L->next=p;
                L=L->next;
        }
        cout<<"单链表创建完毕"<<endl;
        L=L->next;
        return L;
}

int lengthlist(Linklist L)
{
        if(L=NULL)
                return 0;
        int i=1;
        Linklist p=L->next;
        while(p!=L)
        {
                i++;
                p=p->next;
        }
        return i;
}

int scanlist(Linklist L)
{
        Linklist p=L;
        if(p==NULL)
        {
                cout<<"人数为空"<<endl;
                return ERROR;
        }
        cout<<"第一个人密码为:"<<p->key<<endl;
        p=p->next;
        while(p!=L)
        {
                cout<<"第"<<p->number<<"个人的密码为:"<<p->key<<endl;
                p=p->next;
        }
}
       
       
       
int gamelist(Linklist&L,int m)
{       
        if(L==NULL)
        {
                cout<<"人数为空,出列结束"<<endl;
                return ERROR;
        }
        Linklist p=L;
        while(p->next!=L)
                p=p->next;
        for(int n=lengthlist(L);n>0;n--)
        {
                cout<<"密码为:"<<m<<",出列编号为:";
                for(int i=1;i<=m%n-1;i++)
                        p=p->next;
                cout<<p->next->number<<endl;
                m=p->next->key;
                Linklist q=p->next;
                p->next=q->next;
                free(q) ;
        }
        return 1;
}


int main()
{
        int m,n;
        cout<<"请输入初始密码"<<endl;
        cin>>m;
        cout<<"请输入人数"<<endl;
        cin>>n;
        Linklist L=intilist(n);
        cout<<n<<"个人的密码为"<<endl;
        scanlist(L);
        cout<<n<<"个人的出列顺序为"<<endl;
        gamelist(L,m);
}

Mikel 发表于 2016-6-16 15:59:35

    Linklist p=L->next;

Mikel 发表于 2016-6-20 18:18:49

第51行你把L赋值为NULL

ELI_ 发表于 2016-6-30 21:02:24

谢谢分享

千亩计者 发表于 2016-8-16 23:19:24

Linklist p=L->next;
页: [1]
查看完整版本: 约瑟夫问题