2014-12-02 106 views
0

所以,我想初始化LinkedList類使用initializer_list。LinkedList使用initializer_list

template<typename T> 
SortedList<T>::SortedList(initializer_list<T> e){ 
    head_= new Node<T>(*e.begin()); 

    long intcheck = 0; 
    T old; 

    for (auto x : e){ 
     if(intcheck > 0){ 
      Node<T>* curr = new Node<T>(old); 
      if(head_ == curr){ 
       head_->next_ = new Node<T>(x); 
      } 
      curr->next_ = new Node<T>(x); 
     } 

     old = x; 
     intcheck = 1; 
    } 


} 

我試圖打印頭_-> next_(沒有錯,我的打印功能)時收到賽格故障

+2

首先,你應該檢查是否'initializer_list'是解引用之前空。接下來,編寫一個簡單的'for'語句來遍歷'[e.begin()+ 1,e.end())',並去掉那個'intcheck'的東西;這不適合基於'for'的範圍。那麼,對於你所顯示的代碼,「if(head_ == curr)」會如何?這可以解釋爲什麼打印head_-> next_'崩潰,你永遠不會分配任何東西給它。你需要重新思考你想要實現的邏輯。 – Praetorian 2014-12-02 00:51:39

+0

並請使用智能指針 – 2014-12-02 01:04:20

+0

'if(head_ == curr)'中的條件永遠不會成立。但無論如何,這個循環保證不在最初的列表中插入最後一個值。那真的是你想要的嗎?也考慮將'intcheck'的類型從'int'改爲'bool'並重命名,但是真的,這裏擺脫了所有的東西並從頭開始。 – 2014-12-02 01:46:26

回答

1

我假設你實際上想要對SortedList進行排序。如果是這樣,這將實現這一目標。如果initializer_list是空的,它會提早退出,但仍會使對象保持理性狀態。

template<typename T> 
SortedList<T>::SortedList(initializer_list<T> e) : head_{nullptr} { 
    if (e.size() == 0) 
     return; 
    auto it = e.begin(); 
    for (head_ = new Node<T>(*it); it != e.end(); ++it) { 
     Node<T> *n = new Node<T>(*it); 
     Node<T> *curr; 
     for (curr = head_; curr->next_ && curr->next_->data_ < *it; curr = curr->next_) 
      continue; 
     if (*it < curr->data_) { 
      n->next_ = curr; 
      head_ = n; 
     } else { 
      n->next_ = curr->next_; 
      curr->next_ = n; 
     } 
    } 
} 

爲了完整起見,這裏是我用來測試的析構函數:

所有的
template<typename T> 
SortedList<T>::~SortedList() { 
    while (head_->next_) { 
     Node<T> *t = head_->next_; 
     head_->next_ = t->next_; 
     delete t; 
    } 
    delete head_;  
} 
0

您的代碼表示,頭_-> next_將永遠是它的默認值(我們可以」看到Node構造函數,所以我不能說這是什麼)。

for (auto x : e){ 
    if(intcheck > 0){ 
     Node<T>* curr = new Node<T>(old); 
     if(head_ == curr){ 
      head_->next_ = new Node<T>(x); 
     } 

你可以通過這種方式將你的初始化列表發送到for循環。如果它是空的,您將立即退出循環。

但是,您的curr指針正好在那裏分配,而您的head_指針分配在上面。因此,它們將永遠不會相同,因爲您正在比較您在同一個函數中分配的兩個指針。