链表值C++; 我试图自学C++。为了做到这一点,我对自己提出了一个挑战,即编写一个prime finder应用程序。我曾经用一种效率较低的算法成功地学习过python(学习python)。我用一个双链表来存储素数。目前,我只是尝试在一个线程中运行它,但我将它设置为双链接,以便以后可以对其进行多线程处理
无论如何,TL;DR调试器显示程序被卡住了,试图在主构造函数中为起始链接的prm int赋值。我已经做了大量搜索,但我无法找出我做错了什么。(还要注意,BING是调试消息)链表值C++; 我试图自学C++。为了做到这一点,我对自己提出了一个挑战,即编写一个prime finder应用程序。我曾经用一种效率较低的算法成功地学习过python(学习python)。我用一个双链表来存储素数。目前,我只是尝试在一个线程中运行它,但我将它设置为双链接,以便以后可以对其进行多线程处理,c++,pointers,struct,linked-list,C++,Pointers,Struct,Linked List,无论如何,TL;DR调试器显示程序被卡住了,试图在主构造函数中为起始链接的prm int赋值。我已经做了大量搜索,但我无法找出我做错了什么。(还要注意,BING是调试消息) #包括 #包括 #包括 使用名称空间std; 使用std::cout; 结构柱{ int prm; 普林克*下一步; 普林克*上; }; 类素数{ 公众: PLink*开始,*结束; 素数(){ 开始->prm=2; 结束->prm=3; 开始->下一步=结束; 结束->下一步=空; 开始->上一个=空; 结束->上一
#包括
#包括
#包括
使用名称空间std;
使用std::cout;
结构柱{
int prm;
普林克*下一步;
普林克*上;
};
类素数{
公众:
PLink*开始,*结束;
素数(){
开始->prm=2;
结束->prm=3;
开始->下一步=结束;
结束->下一步=空;
开始->上一个=空;
结束->上一个=开始;
addToEnd(5);
cout-next=tmp;
tmp->next=NULL;
tmp=结束;
库特prm
第二版代码>使用STD::CUT/<代码>是冗余的,可以读取一些关于C++名称可见性的文档,如:
好吧,为了不造成内存泄漏并双重释放同一指针,您应该小心地操作您创建的对象。为什么不使用STLstd::list
,然后您就可以继续执行程序试图执行的操作了——查找素数。start->prm=2;end->prm=3;start->next=end;
您正在访问的在构造函数中没有初始化的指针。这将不起作用。如果你必须编写自己的链表,不要将它与主搜索器进行配对。你必须同时调试两个算法。不好玩。我建议你先编写自己的、工作的链表。你缺少了很多关于C++内存的基本原理。否则,如果你的目标是让一个主查找器工作,那么,正如我的第一条评论建议的那样,把指针去掉,使用语言库作为双链表的代码,那就是<代码> STD::清单< /C>。谢谢你这么快的回答,就像我说的,我刚学C++,我非常精通C语言和java语言。我选择了这个挑战,因为我可以从中学习指针,并且尝试学习C++内存管理。我也不知道STD::列表是一件事。那么我如何正确初始化指针呢?
#include <iostream>
#include <math.h>
#include <cmath>
using namespace std;
using std::cout;
struct PLink{
int prm;
PLink *next;
PLink *prev;
};
class Prime{
public:
PLink *start, *end;
Prime(){
start -> prm = 2;
end -> prm = 3;
start->next = end;
end->next = NULL;
start->prev = NULL;
end->prev = start;
addToEnd(5);
cout <<"cbing" << endl;
}
void insert(int val){
}
void addToEnd(int val){//adds a new prime to the end of the list
PLink *tmp = new PLink;
tmp->prm = val;
tmp->prev = end;
end->next = tmp;
tmp->next = NULL;
tmp = end;
cout << tmp->prm << endl;
cout << "addbing" << endl;
}
bool comp(int pot){ //compares the potential prime against known primes via modulo
int lim = sqrt(pot);
PLink * current = start;
bool check = false;
cout<<"bing " << pot << endl;
while (current->prm < lim && check == false){
if (pot%current->prm == 0) {
check = true;}
current = current->next;
}
return check; //false means its prime true means its not
}
};
int main()
{
Prime primeList;
int cap = 10000;
int beg = 5;
int count = 3;
bool toggle = false;
bool check = false;
cout << "2 \n3 \n5" << endl;
while(count < cap){
beg += 2;
cout << "bing" << endl;
if (toggle){
beg += 2;}
toggle = !toggle;
check = primeList.comp(beg);
if (check == false){
primeList.addToEnd(beg);
count++;
cout << "bing2" << endl;
}
}
};
using namespace std;
using std::cout;
Prime(){
start -> prm = 2;
end -> prm = 3;
start->next = end;
end->next = NULL;
start->prev = NULL;
end->prev = start;
addToEnd(5);
cout <<"cbing" << endl;
}
Prime(){
start = new PLink(); // use the default constructor generated by C++ complier since you haven't declared one in struct PLink
end = new PLink()
start -> prm = 2;
end -> prm = 3;
start->next = end;
end->next = NULL;
start->prev = NULL;
end->prev = start;
addToEnd(5);
cout <<"cbing" << endl;
}