2017-09-24 105 views
-2

我正在爲數據結構類做一個簡單的鏈接列表,並且無法理解頭指針應該如何工作。鏈接列表頭C++

template <typename E> 
class SSLL{ 
template<typename E> 
     struct Node { 
      E data; 
      Node* next; 
     }; 
public: 
template <typename E> 
    SSLL(); 
    void push_front(E element); 
private: 
    Node<E> * head; 
    Node<E> * tail; 
}; 
template <typename E> 
SSLL<E>::SSLL() { 
    head = NULL; 
    tail = NULL; 
} 
template <typename E> 
void SSLL<E>::push_front(E element) { 
    Node<E> * n = new Node<E>; 
    n->data = element; 
    n->next = head; 
    head = n; 
    if (!tail) { 
     tail = n; 
    } 
} 

然而,並不本作頭的第一個元素的列表,而不是一個指向第一個元素。

我試圖改變push_front(E元素),但我得到空指針錯誤。

template <typename E> 
void SSLL<E>::push_front(E element) { 
    Node<E> * n = new Node<E>; 
    n->data = element; 
    n->next = head->next; 
    head->next = n; 
    if (!tail) { 
     tail->next = n; 
    } 
} 

所有的例子我在網上找有頭= n,但我仍然無法理解爲什麼它是這樣的,而不是頭戴式>未來= N。

謝謝。

+1

看起來你需要用調試器逐行掃描你的代碼一行一行地得到一個gras發生了什麼事情。 – user0042

+1

調試鏈表的另一個好工具是筆和紙。我沒有騙你。畫吸盤。在節點中繪製。一次更改一次,將列表重新配置到列表應該在操作之後的新配置中。比較你所做的事情,以便將列表轉換可視化爲您在代碼中執行的操作,並相應地調整代碼。 – user4581301

+0

太好了。這比較容易閱讀。問問你自己,當'head'是'NULL'時,在第一次插入到列表中的時候'head-> next'會發生什麼? – user4581301

回答

1

在大多數形式的鏈表,頭指針指向第一個節點列表或爲空:

  +---+  +---+  +--+ 
head --> | A | --> | B | --> |/0| 
     +---+  +---+  +--+ 
        ^ 
        | 
tail ----------------+ 

很多初學者混淆的列表與節點。節點是包含數據的對象。列表是一組節點。

在頭部
在前面插入推需要以下步驟:

  1. 使新節點指向頭節點。
  2. 更改頭節點以指向新節點。

1)使新節點指向根節點:

  +---+ 
p_new -->| C | 
     +---+ 
      | 
      V 
     +---+  +---+  +--+ 
head --> | A | --> | B | --> |/0| 
     +---+  +---+  +--+ 

2)使頭指向新節點:

  +---+ 
p_new -->| C | 
head -->| | 
     +---+ 
      | 
      V 
     +---+  +---+  +--+ 
     | A | --> | B | --> |/0| 
     +---+  +---+  +--+ 

在C++中,這將如下所示:

Node * p_node = new Node; 
p_node->next = head; // Step 1. 
head = p_node; // Step 2.