[c++求看代码]约瑟夫问题

emmaaaaaaaa 2016-10-16 12:50:15
#include<iostream>
using namespace std;
struct people
{
int num;
people*left;
people*right;
};

class circle {
public:
circle(){p1=new people;p1->left=NULL;p1->right=NULL;p1->num=0;sum=0;};
circle(int ssum);
people* out(int m,people*before);
void screen();
~circle(){delete p1;}
private:
people* p1;
int sum;
};


circle ::circle(int ssum)
{
sum=ssum;
p1=new people;
people *s=p1;
s->num=1;
p1->left=NULL;
for(int i=0;i<sum-1;i++)
{
people *r=new people;
r->num=i+2;
r->left=s;
s->right=r;
r->right=NULL;
s=r;
}
s->right=p1;
p1->left=s;
};


people* circle::out(int m,people*after)
{
int y=m%sum;
people*p=after->left;
for(int i=0;i!=y;i++)
{p=p->right;}
p->left->right=p->right;
p->right->left=p->left;
people*q=p->right;
delete p;
sum--;
return q;
};


void circle::screen()
{
int mm;
cout<<"请输入第m人出局:";
cin>>mm;
people*r=out(mm,p1);
for(int i=0;r!=r->left;i++)
{
r=out(mm,r);
}
cout<<r->num<<endl;
};


void main()
{
int i;
cout<<"请输入总人数:"<<endl;
cin>>i;
circle test(i);
test.screen();
}

//总人数和m值不同 有的就没有任何问题 有的就有问题 会显示要我调试 求问
...全文
288 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
emmaaaaaaaa 2016-10-17
  • 打赏
  • 举报
回复
您好 我的确自己查了很多遍 真的查不出来了 我想用的的确是循环列表 请问我哪里用错了么?还请明鉴 谢谢
小灸舞 2016-10-17
  • 打赏
  • 举报
回复
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
提醒:再牛×的老师也无法代替学生自己领悟和上厕所!
单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。
paschen 版主 2016-10-16
  • 打赏
  • 举报
回复
单步跟踪程序运行,以观察程序运行与你预期逻辑是否一致
kd1158 2016-10-16
  • 打赏
  • 举报
回复
你应该考虑当链表里面只剩下两个数的时候,无论哪一个只有前继或者只有一个后继指针跟这段代码矛盾p->left->right=p->right; p->right->left=p->left; people*q=p->right; 我给你的建议是要么做适当的修改要么,就改成循环链表。

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧