单链表解约瑟夫环问题

#include<iostream.h>template<classT>structLinkNode{Tdata;LinkNode*link;};template<cla... #include <iostream.h>

template<class T>
struct LinkNode
{
T data;
LinkNode *link;
};

template<class T>
class List
{
private:
int lenth;
int num;
LinkNode<T> *first;
public:
List(int size,int number);
void show();
void Josephus();
};

template<class T>
List<T>::List(int size,int number)
{
lenth=size;
num=number;

first=new LinkNode<T>;
LinkNode<T> *current,*s;

current=first;
for (int i=0;i<lenth;i++)
{
s=new LinkNode<T>;
s->data=i+1;
current->link=s;
current=s;
}
current->link=first->link;
}

template<class T>
void List<T>::show()
{
LinkNode<T> *current;

current=first;
for (int i=0;i<lenth;i++)
{
current=current->link;
cout<<current->data<<' ';
}
cout<<endl;
}

template<class T>
void List<T>::Josephus()
{
LinkNode<T> *current,*s;

current=first->link;
for (int i=0;i<lenth-1;i++)
{
for (int j=1;j<num;j++)
{
s=current;
current=current->link;
}
s->link=current->link;
current=s->link;
lenth--;
show();
}
}

#include "stdafx.h"
#include "Josephus.h"
#include <iostream.h>

int main(int argc, char* argv[])
{
List<int> link(8,3);
link.show();

link.Josephus();
link.show();

return 0;
}

为什么s不能循环?程序哪里错了?(希望在原程序上改动,不要给出另外算法),谢谢~
展开
 我来答
ggdmdf
2008-10-13 · TA获得超过1520个赞
知道小有建树答主
回答量:1024
采纳率:0%
帮助的人:1241万
展开全部
弱弱地说一句,写得挺啰嗦的……

// Josephus.h
#include <iostream.h>

template<class T>
struct LinkNode
{
T data;
LinkNode *link;
};

template<class T>
class List
{
private:
int lenth;
int num;
LinkNode<T> *first;
public:
List(int size,int number);
void show();
void Josephus();
};

template<class T>
List<T>::List(int size,int number)
{
lenth=size;
num=number;

first=new LinkNode<T>;
LinkNode<T> *current,*s;

current=first;
for (int i=0;i<lenth;i++)
{
s=new LinkNode<T>;
s->data=i+1;
current->link=s;
current=s;
}
current->link=first->link;
}

template<class T>
void List<T>::show()
{
LinkNode<T> *current;

current=first;
for (int i=0;i<lenth;i++)
{
current=current->link;
cout<<current->data<<' ';
}
cout<<endl;
}

template<class T>
void List<T>::Josephus()
{
LinkNode<T> *current,*s;

current=first->link;
// 修改下循环条件,当最后剩下一个人的时候退出循环
//for (int i=0;i<lenth-1;i++)
while (current != current->link)
{
for (int j=1;j<num;j++)
{
s=current;
current=current->link;
}
s->link=current->link;
// 需要重定向first的link,这也是结果错误的原因
if (current == first->link) first->link = current->link;
// 记得删除current,不然内存泄露
delete current; // delete
current=s->link;
lenth--;
show();
}
// 删除最后一个
delete current;
// 删除first
delete first;
}

// main.cpp
#include "Josephus.h"
#include <iostream.h>

int main(int argc, char* argv[])
{
List<int> link(8,3);
link.show();

link.Josephus();
// 删除之后不需要show了,多用个show的话反而出问题。

return 0;
}
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
厦门鲎试剂生物科技股份有限公司
2023-08-01 广告
BG试验又称为G试验,是一种基于真菌细胞壁成分的血清学试验。BG试验检测的是真菌细胞壁中的葡聚糖成分。操作步骤如下:1. 左键单击【View】2. 左键单击【Residual Diagnostics】3. 左键单击【Series Corre... 点击进入详情页
本回答由厦门鲎试剂生物科技股份有限公司提供
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式