鱼C论坛

 找回密码
 立即注册
查看: 4164|回复: 4

约瑟夫问题

[复制链接]
发表于 2016-6-16 15:59:34 | 显示全部楼层 |阅读模式
20鱼币
编号为1~N的N个人按顺时针方向坐一圈,每个人持有一个密码(正整数,可以自由输入),
开始人选一个正整数作为报数上限值M,从第一个人按顺时针方向自1开始顺序报数,报到M时
停止报数。报M的人出列,将他的密码作为新的M值,从他顺时针方向上的下一个人开始从1报数,
如此下去,直至所有人出列
在运行时,总会显示运行失败,求大神指导


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

最佳答案

查看完整内容

Linklist p=L->next;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-6-16 15:59:35 | 显示全部楼层
    Linklist p=L->next;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-6-20 18:18:49 | 显示全部楼层
第51行你把L赋值为NULL
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-6-30 21:02:24 | 显示全部楼层
谢谢分享
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-8-16 23:19:24 | 显示全部楼层
Linklist p=L->next;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-23 02:04

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表