求高手帮忙解决!! 以下程序运行时总是出错,可是不知道错在哪里?希望尽快帮我解决啊!
是求解约瑟夫问题,用无头结点的单循环链表实现。n是指人数,m是指报到m的人出圈,从约定编号k开始报数。#include<iostream.h>#include"CLink...
是求解约瑟夫问题,用无头结点的单循环链表实现。n是指人数,m是指报到m的人出圈,从约定编号k开始报数。
#include<iostream.h>
#include"CLinkList.h"
typedef int T;
template <class T>
void CLinkList<T>::OutLine(int n,int m,int k)
{
Node<T> *pre,*p;
int count;
for(int i=1;i<k;i++)
{
pre=p;
p=p->next;
}
while(p!=p->next)
{
for(count=1;count<m;count++)
{
pre=p;
p=p->next;
}
cout<<p->data;
pre->next=p->next;
delete p;
p=pre->next;
}
cout<<p->data;
}
template<class T>
void CLinkList<T>::CreateList(int n)
{
Node<T> *p,*q;
p=Head;p->data=1;
for(int i=2;i<=n;i++)
{
q=new Node<T>;
q->data=i;
q->next=p->next;
p->next=q;
p=q;
cout<<q->data;
}
p->next=Head;
}
int main()
{
int n,m,k;
cout<<"输入n,m,k的值";
cin>>n>>m>>k;
CLinkList<int>L;
L.CreateList(n);
cout<<"出列顺序为:";
L.OutLine(n,m,k);
return 0;
} 展开
#include<iostream.h>
#include"CLinkList.h"
typedef int T;
template <class T>
void CLinkList<T>::OutLine(int n,int m,int k)
{
Node<T> *pre,*p;
int count;
for(int i=1;i<k;i++)
{
pre=p;
p=p->next;
}
while(p!=p->next)
{
for(count=1;count<m;count++)
{
pre=p;
p=p->next;
}
cout<<p->data;
pre->next=p->next;
delete p;
p=pre->next;
}
cout<<p->data;
}
template<class T>
void CLinkList<T>::CreateList(int n)
{
Node<T> *p,*q;
p=Head;p->data=1;
for(int i=2;i<=n;i++)
{
q=new Node<T>;
q->data=i;
q->next=p->next;
p->next=q;
p=q;
cout<<q->data;
}
p->next=Head;
}
int main()
{
int n,m,k;
cout<<"输入n,m,k的值";
cin>>n>>m>>k;
CLinkList<int>L;
L.CreateList(n);
cout<<"出列顺序为:";
L.OutLine(n,m,k);
return 0;
} 展开
3个回答
展开全部
#include"CLinkList.h"
没有发?
给你个看看吧
#include "iostream.h"
/*******************************************************************************
单循环链表的结点类
*******************************************************************************/
class Node
{
friend class Linklist;
public:
Node();
int data;
Node *next;
};
/*******************************************************************************
单循环链表类
*******************************************************************************/
class Linklist
{
public:
Linklist();
void Creatlist(Linklist &L);
int getLength(Linklist &L);
Node * Head;
};
/*******************************************************************************
Node类的构造函数,初始化结点数据
*******************************************************************************/
Node::Node()
{
data = 0;
next = NULL;
}
/*******************************************************************************
Linklist类的构造函数,初始化首结点数据
*******************************************************************************/
Linklist::Linklist()
{
Head = NULL;
}
/*******************************************************************************
建立单循环链表
*******************************************************************************/
void Linklist::Creatlist(Linklist &L)
{
cout << "请输入生死游戏的总人数N:";
int n;
cin >> n;
Node *p;
for (int i = n; i > 0; i --)
{
p = new Node;
p->data = i;
p->next = L.Head;
L.Head = p;
}
while (p->next) {
p = p->next;
}
p->next = L.Head;
}
/*******************************************************************************
获取单循环链表的长度
*******************************************************************************/
int Linklist::getLength(Linklist &L)
{
Node *p=L.Head;
int count=0;
while (p->next!=L.Head) {
count++;
p = p->next;
}
count++;
return count;
}
/*******************************************************************************
主函数,实现约瑟夫生死游戏
*******************************************************************************/
void main ()
{
cout << "现有N人围成一圈,从第S个人开始依次报数,报M的人出局,";
cout << "再由下一人开始报数,如此循环,直至剩下K个人为止" << '\n' << '\n';
Linklist L;
L.Creatlist(L);
cout << "请输入游戏开始的位置S:"<< '\t' ;
int s;
cin >> s;
cout << "请输入死亡数字M:"<< '\t';
int m;
cin >> m;
cout << "请输入剩余的生者人数K:"<< '\t';
int k;
cin >> k;
cout<< '\n' ;
Node *p, *q, *r;
p = L.Head;
for(int i = 0; i < s - 1; i ++) //找出s结点
{
p = p->next;
}
int t = 1;
while ( k < L.getLength(L) ) {
for(int j = 0; j < m - 1; j ++) //报数,找出m结点
{
q = p;
p = p->next;
}
if (p == L.Head) { //元素出列
r = p;
L.Head = p->next;
q->next = p->next;
p = p->next;
}
else
{
r = p;
q->next = p->next;
p = p->next;
}
cout << "第" << t << "个死者的位置是:" << '\t'<< r->data << '\n';
t ++;
}
cout<< '\n' << "最后剩下:" << '\t' << L.getLength(L) << "人" <<endl;
cout<< "剩余的生者位置为:" << '\t';
p = L.Head;
while(p->next!=L.Head){
cout<< p->data << '\t';
p=p->next;
}
if(p)
cout<< p->data << '\t' ;
cout<< '\n';
}
没有发?
给你个看看吧
#include "iostream.h"
/*******************************************************************************
单循环链表的结点类
*******************************************************************************/
class Node
{
friend class Linklist;
public:
Node();
int data;
Node *next;
};
/*******************************************************************************
单循环链表类
*******************************************************************************/
class Linklist
{
public:
Linklist();
void Creatlist(Linklist &L);
int getLength(Linklist &L);
Node * Head;
};
/*******************************************************************************
Node类的构造函数,初始化结点数据
*******************************************************************************/
Node::Node()
{
data = 0;
next = NULL;
}
/*******************************************************************************
Linklist类的构造函数,初始化首结点数据
*******************************************************************************/
Linklist::Linklist()
{
Head = NULL;
}
/*******************************************************************************
建立单循环链表
*******************************************************************************/
void Linklist::Creatlist(Linklist &L)
{
cout << "请输入生死游戏的总人数N:";
int n;
cin >> n;
Node *p;
for (int i = n; i > 0; i --)
{
p = new Node;
p->data = i;
p->next = L.Head;
L.Head = p;
}
while (p->next) {
p = p->next;
}
p->next = L.Head;
}
/*******************************************************************************
获取单循环链表的长度
*******************************************************************************/
int Linklist::getLength(Linklist &L)
{
Node *p=L.Head;
int count=0;
while (p->next!=L.Head) {
count++;
p = p->next;
}
count++;
return count;
}
/*******************************************************************************
主函数,实现约瑟夫生死游戏
*******************************************************************************/
void main ()
{
cout << "现有N人围成一圈,从第S个人开始依次报数,报M的人出局,";
cout << "再由下一人开始报数,如此循环,直至剩下K个人为止" << '\n' << '\n';
Linklist L;
L.Creatlist(L);
cout << "请输入游戏开始的位置S:"<< '\t' ;
int s;
cin >> s;
cout << "请输入死亡数字M:"<< '\t';
int m;
cin >> m;
cout << "请输入剩余的生者人数K:"<< '\t';
int k;
cin >> k;
cout<< '\n' ;
Node *p, *q, *r;
p = L.Head;
for(int i = 0; i < s - 1; i ++) //找出s结点
{
p = p->next;
}
int t = 1;
while ( k < L.getLength(L) ) {
for(int j = 0; j < m - 1; j ++) //报数,找出m结点
{
q = p;
p = p->next;
}
if (p == L.Head) { //元素出列
r = p;
L.Head = p->next;
q->next = p->next;
p = p->next;
}
else
{
r = p;
q->next = p->next;
p = p->next;
}
cout << "第" << t << "个死者的位置是:" << '\t'<< r->data << '\n';
t ++;
}
cout<< '\n' << "最后剩下:" << '\t' << L.getLength(L) << "人" <<endl;
cout<< "剩余的生者位置为:" << '\t';
p = L.Head;
while(p->next!=L.Head){
cout<< p->data << '\t';
p=p->next;
}
if(p)
cout<< p->data << '\t' ;
cout<< '\n';
}
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
没看出来,检查了下语法,貌似语法没问题
追问
我发现问题是出在OutLine函数中,具体是什么地方就是找不出来,一运行到那一步就出错
追答
还是没发现问题
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
表头 Head 的初始化放在哪里
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询