链表值C++; 我试图自学C++。为了做到这一点,我对自己提出了一个挑战,即编写一个prime finder应用程序。我曾经用一种效率较低的算法成功地学习过python(学习python)。我用一个双链表来存储素数。目前,我只是尝试在一个线程中运行它,但我将它设置为双链接,以便以后可以对其进行多线程处理

链表值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; 开始->下一步=结束; 结束->下一步=空; 开始->上一个=空; 结束->上一

无论如何,TL;DR调试器显示程序被卡住了,试图在主构造函数中为起始链接的prm int赋值。我已经做了大量搜索,但我无法找出我做错了什么。(还要注意,BING是调试消息)

#包括
#包括
#包括
使用名称空间std;
使用std::cout;
结构柱{
int prm;
普林克*下一步;
普林克*上;
};   
类素数{
公众:
PLink*开始,*结束;
素数(){
开始->prm=2;
结束->prm=3;
开始->下一步=结束;
结束->下一步=空;
开始->上一个=空;
结束->上一个=开始;
addToEnd(5);
cout-next=tmp;
tmp->next=NULL;
tmp=结束;
库特prm

第二版代码>使用STD::CUT/<代码>是冗余的,可以读取一些关于C++名称可见性的文档,如:


好吧,为了不造成内存泄漏并双重释放同一指针,您应该小心地操作您创建的对象。

为什么不使用STL
std::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;
}