2015-04-17 5 views
-2

Я хочу реализовать круговой двойной список. этот список включает только эти символы в переданном в строковом объекте Вот мой код, но я всегда получаю seg fault. Я использую фиктивную головку для этого спискаЦиркулярно связанный двойной список C++

#ifndef MY_LIST_H 
#define MY_LIST_H 
#include <string> 
#include <iostream> 
using namespace std; 
/**------ ----------------- 
* dummy |->|pred|value|next| 
* ------ ----------------- 
* */ 


struct Node 
{ 
char value; 
Node *next; 
Node *pred; 

Node(char value): value(value), next(0), pred(0){}; 
}; 

class MyList 
{ 
    private: 
    Node* head; 
    unsigned int count; // count number of node 

    public: 
    // default constructor 
    MyList(): count(0) 
    { 
     head = new Node('P'); 

    } 

    //Constructs a list from a passed-in string object, 
    MyList(const string& str): count(0) 
    { 
     Node *cur = head; 
     if(count == 0) 
     { 
      head-> pred = head; 
      head-> next = head; 
     } 
     else 
     { 
      for(unsigned i =0; i< str.length(); ++i) 
      { 
       cur->next = new Node(str.at(i)); 
       Node *temp = cur->next; 
       temp-> pred = cur; 
       ++count; 
       if(count == str.length()) 
       { 
        cur->next->next = head; 
        head-> pred = cur-> next->pred; 
       } 
      } 
     } 
    } 
    void print() const 
    { 
     Node *cur = head->next; 
     while(cur != head) 
     { 
      cout << cur-> value; 
      cur = cur-> next; 
     } 
    } 

}; 
#endif 
+2

Рассмотрите возможность использования GDB, чтобы узнать, где именно ошибка. – CyberGuy

ответ

1

Вы, кажется, не понимаете конструкторов очень хорошо.

При инициализации вашего класса вызывается только один конструктор. Вы можете вызвать конструктор из другого конструктора, если хотите, но это не из-за defaut: Can I call a constructor from another constructor (do constructor chaining) in C++?.

В вашем случае, ваш второй конструктор должен, вероятно, будет что-то вроде этого: MyList(const string& str): MyList() { ... }

Таким образом head Виль правильно initalized, и вы не будете создавать Segfault.

Достаточно вы можете запустить свой код в режиме отладки, в отладчике и узнать, в какой строке сбой кода. using namespace ...; в заголовке также является плохой практикой, так как вы не знаете, где будет включен ваш заголовок.

0

Трудно сказать, что именно происходит, не зная, как вы используете эти классы, но ваш конструктор MyList, перегруженный на строку, разбивается с места в карьер. Он устанавливает счет 0, так что вы знаете, что он всегда будет вводить предложение if и никогда не будет else.

MyList(const string& str): count(0) 
{ 
    Node *cur = head; 
    if(count == 0) 
    { 
     head-> pred = head; 
     head-> next = head; 
    } 
    else . . . 

внутри, если заявление, он пытается разыменования head, который никогда не было назначено значение. Вы устанавливаете его в конструкторе по умолчанию, но этот, похоже, не делает ничего другого.

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

Предполагая, что второй конструктор должен быть вспомогательным методом, он все равно не работает, потому что счетчик никогда не выходит за ноль (за исключением предложения else, но вы не можете попасть туда с count==0).

Я признаю, что я не очень внимательно, но я предполагаю, что если выполнение этого далеко:

cur->next->next 

не всегда будет установлен, когда вы пытаетесь получить к нему доступ. если cur-> next - nullptr, тогда ваша программа умирает.

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