2016-06-01 2 views
2

Я пытаюсь научить себя C++. для этого я сделал вызов самому себе написать приложение для простого поиска. Мне удалось раз в python (изучить python) с менее эффективным алгоритмом. Я использую двусвязный список для хранения простых чисел. в настоящее время я просто пытаюсь запустить это в одном потоке, но я сделал его вдвойне связанным, чтобы впоследствии его можно было многопоточно.проблема со связанными значениями списка C++

В любом случае, TL; DR отладчик показывает, что программа застревает, пытаясь присвоить значение 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;   
     } 
    }  
}; 
+0

Почему бы не просто использовать STL 'std :: list', а затем вы могли бы продолжить то, что ваша программа пытается сделать - найти простые числа. – PaulMcKenzie

+1

'start -> prm = 2; end -> prm = 3; start-> next = end; 'Вы получаете доступ к неинициализированному указателю в конструкторе. Это не будет работать. – PaulMcKenzie

+0

И если вы должны написать свой собственный Связанный список, не связывайте его с основным поисковым устройством. Вы вынуждены одновременно отлаживать два алгоритма. Не весело. – user4581301

ответ

0
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++ complier (скажем, «gcc» или clang) o nly выделите память для хранения этого указателя, но не выделяйте память для хранения указателя (здесь это означает ваш объект 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; 
} 

Ну, для того, чтобы не вызывать утечка памяти и двойное освобождение того же указателя, вы должны тщательно манипулировать созданным вами объектом.

Смежные вопросы