您的位置:首页 > 编程语言 > Qt开发

C++循环链表解决约瑟夫环问题,Qt编程

2013-10-30 11:20 561 查看
问题描述:

约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。

实现代码:

输入输出头文件

#ifndef MYSTDINOUT_H
#define MYSTDINOUT_H

#include <QTextStream>

static QTextStream cin(stdin);
static QTextStream cout(stdout);

#endif // MYSTDINOUT_H

 

包含约瑟夫环类的头文件

#ifndef JOSEPH_H
#define JOSEPH_H
#include "mystdinout.h"
#include <QTextStream>
//建立Joseph节点的结构体
struct JosephNode
{
JosephNode * Next;
int Pos;
};
//约瑟夫环类
class JosephRing
{
public:
void CreatJR();
void Jose();
private:
JosephNode * JR;//存放链表头指针
};

//建立约瑟夫环,单向循环链表
void JosephRing:: CreatJR()
{
JosephNode * head,* s, * r;
int Num;
cout<<"please input the Num of JosephRing:"<<endl;
cin>>Num;
head = new JosephNode;
r = head;
for(int i = 1; i<=Num; i++)
{
s = new JosephNode;
s ->Pos = i;
r ->Next = s;
r = s;
}
r ->Next = head ->Next;//构成循环链表
JR = head;//链表头指针赋给对象头指针
}

//删除节点,从第s个开始报数,报到m出列
void JosephRing:: Jose()
{
int s,m;
cout<<"please input the start Num"<<endl;
cin>>s;
cout<<"please input period Num "<<endl;
cin>>m;
JosephNode * p;
p = JR ->Next;
JosephNode * q;
for(int i = 1; i<=s-1; i++)//找到开始报数的人
{
q = p;
p = p->Next;
}
while(p ->Next != p)
{
for(int j = 1; j<= m-1; j++)//找到报m的人,删除节点
{
q = p;
p = p->Next;
}
cout<<p->Pos<<" ";
q->Next = p->Next;//删除节点
delete p;
p = q->Next;//从下一个开始计数
}
cout<<p->Pos<<endl;
}

#endif // JOSEPH_H

主函数

/******************************************************

*Project:JosephRing约瑟夫环问题

*Author:yujiao

*Date:2013.10.24

*Input:总人数Num,第一个计数位置s,计数周期m

*Output:被清出的顺序

******************************************************/

#include <QCoreApplication>
#include"Joseph.h"

int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);

JosephRing MyJR;//初始化一个对象
MyJR.CreatJR();//输入总人数,建立循环链表
MyJR.Jose();//从第s个人开始计数,数到m的人被踢出

return a.exec();
}

运行结果演示


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息