2013-04-23 4 views
0

Я пытаюсь создать несколько узлов для дважды связанного списка и распечатать их. Так что я создаю мой dnode класс:Назначение указателей с двойным указателем в конструкторе

template <typename T> 
class dnode 
{ 
    public: 
     T nodeValue; 
     dnode<T> *prev; 
     dnode<T> *next; 

     dnode() : prev(this), next(this) {} 

     dnode(const T& item, dnode<T> *prevNode = NULL, dnode<T> *nextNode = NULL) : 
      nodeValue(item), prev(prevNode), next(nextNode) {} 

}; 

Тогда у меня writeList функции:

template <typename T> 
void writeDLinkedList(dnode<T>* header, const string& seperator = " ") 
{ 
    dnode<T> *p = header->next; 

    while (p != header) 
    { 
     cout << p->nodeValue << seperator; 
     p = p->next; 
    } 

    cout << endl << endl; 
} 

В основном, я создаю указатель заголовка и два узла, используя constuctor назначить предыдущие и последующие узлы в круговом списке:

dnode<int> *header, *one, *two; 

header = new dnode<int>(0, two, one); 
one = new dnode<int> (10, header, two); 
two = new dnode<int> (25, one, header); 

writeDLinkedList(header); 

Когда я вызываю writeDLinkedList, я получаю ошибку сегментации. Я был смущен этим, поэтому в конечном итоге я попытался вывести каждое значение узла отдельно, чтобы увидеть, правильно ли работают указатели. Оказывается, они не были. Вместо этого я должен сделать это, чтобы получить функцию печати работает правильно:

header = new dnode<int>; 

one = new dnode<int> (10); 
two = new dnode<int> (25); 
header->next = one; 
one->next = two; 
two->next = header; 

writeDLinkedList(header); 

Я хочу знать, почему мой конструктор не работает так, как надо. Это список инициализации?

+0

'prev' и' next' должны быть инициализированы до 'NULL', а не' this'. Затем проверки для действительных узлов должны быть обновлены, чтобы искать «NULL» во время цикла. –

ответ

1

Ваш конструктор работает. Проблема в том, что вы используете переменные до того, как им были присвоены значения.

dnode<int> *header, *one, *two; 
// one and two have undefined values at this point 

header = new dnode<int>(0, two, one); 
// so undefined values get put into header->next and header->prev 

В двусвязному списке у вас есть указатель циклов, точки узла А в узел В, который указывает обратно на узел А. По стрелочных определения циклов не могут быть созданы только в конструкторах. Поскольку должен быть создан либо узел A, либо узел B сначала. Созданный никогда не может быть создан, указывая на другой узел, так как другой узел еще не существует.

Сопряженные списки немного сложнее, чем вы поняли, я думаю.

+0

Да, я думаю, что недооценил их. Спасибо за краткий ответ. – Taylor

0

Вы неправильно управляете узлами. Попробуйте это вместо:

template <typename T> 
class dnode 
{ 
    public: 
     T nodeValue; 
     dnode<T> *prev; 
     dnode<T> *next; 

     dnode() : prev(NULL), next(NULL) {} 

     dnode(const T& item, dnode<T> *prevNode = NULL) : 
      nodeValue(item), prev(prevNode), next(NULL) 
     { 
      if (prev) 
      { 
       if (prev->next) 
        prev->next->prev = this; 
       prev->next = this; 
      } 
     } 

     ~dnode() 
     { 
      if (prev) 
       prev->next = next; 

      if (next) 
       next->prev = prev; 
     } 
}; 

.

template <typename T> 
void writeDLinkedList(dnode<T>* header, const string& seperator = " ") 
{ 
    dnode<T> *p = header; 

    while (p != NULL) 
    { 
     cout << p->nodeValue << seperator; 
     p = p->next; 
    } 

    cout << endl << endl; 
} 

.

dnode<int> *header, *one, *two; 

header = new dnode<int>(0); 
one = new dnode<int> (10, header); 
two = new dnode<int> (25, one); 

writeDLinkedList(header); 
0

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

#include<iostream> 

class dnode 
{ 

public: 

    dnode(int a):prev(this), next(this), nodeValue(a) 
    {} 
    void connectNode(dnode *newNode) 
    { 
     if(newNode != NULL) 
     { 
      dnode*head = this->next; 
      this->next = newNode; 
      newNode->prev = this; 
      newNode->next = head; 
      head->prev = newNode; 
     } 
    } 

    void writeDNode() 
    { 
    dnode *p = this->next; 
     while(p != this) 
     { 
      std::cout<<"Element "<<p->nodeValue<<std::endl; 
      p = p->next; 
     } 
    } 
private: 
    int nodeValue; 
    dnode *prev; 
    dnode *next; 

}; 


int main(int argc, char*argv[]) 
{ 
    dnode* header = new dnode(-1); 
    dnode *one = new dnode(23); 
    dnode *two = new dnode(45); 
    dnode *three = new dnode(67); 
    header->connectNode(one); 
    one->connectNode(two); 
    two->connectNode(three); 
    header->writeDNode(); 
    std::getchar(); 



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