gpt4 book ai didi

c++ - 链表值 C++ 的问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:46:22 26 4
gpt4 key购买 nike

我正在尝试自学 C++。为此,我向自己提出了一个挑战,那就是编写一个 prime finder 应用程序。我用效率较低的算法在 python 中成功了一次(学习 python)。我正在使用双向链表来存储素数。目前我只是想在单线程中运行它,但我将它双链接,以便以后可以多线程运行。

无论如何,TL;DR 调试器显示程序卡住了,试图在 Prime 构造函数中为起始链接的 prm int 赋值我已经做了很多搜索,但我无法弄清楚我在做什么做错了。 (还要注意 bings 是调试信息)

#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;

第二个 using std::cout; 是多余的,你可以阅读一些关于 C++ 名称可见性的文档,像这样:

http://www.cplusplus.com/doc/tutorial/namespaces/ http://www.tutorialspoint.com/cplusplus/cpp_namespaces.htm

Prime(){
start -> prm = 2;
end -> prm = 3;
start->next = end;
end->next = NULL;
start->prev = NULL;
end->prev = start;
addToEnd(5);
cout <<"cbing" << endl;
}

注意:当你声明一个像 PLink *start, *end; 这样的指针时,C++ 编译器(比如 'gcc' 或 clang)只分配内存来存储该指针,而不分配内存来存储什么你的指针是指向的(这里它意味着你的 PLink 对象)。

因此,您应该为这两个指针指向的PLink 对象分配内存:PLink *start, *end;,也就是说,您必须更改上面的代码:

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;
}

那么,为了不导致内存泄漏和重复释放同一个指针,您应该谨慎操作您创建的对象。

关于c++ - 链表值 C++ 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37558592/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com