2016-12-31 110 views
-2

所以我在尋找一個鏈表與節點設置這樣鏈表指針運算混亂

struct node { 
     node *next; 
     node **prev; 
    }; 
    node *rel_list; 

有人可以解釋的指針操作在下面的代碼塊是如何工作的(從節點創建函數)特別是第5行

1 node *r; 
    2 r->next = rel_list; 
    3 r->prev = &rel_list; 
    4 if (rel_list) 
    5 rel_list->prev = &r->next; 
    6 rel_list = r; 
+0

雙向鏈表中的正確方法是使用'node * next,* prev'。 'node ** prev'很奇怪,並且會導致問題和困惑(這個想法大概是指向下一個節點是來自'this'的前一個節點''下一個'節點的成員)。然而,目前還不清楚你想要實現什麼以及代碼塊的意圖是什麼。 – Walter

+0

爲什麼使用'node ** prev'而不是'node * prev'。 'prev'應該指向'node',而不是指針。 –

+0

在互聯網上搜索「C++鏈接列表示例」並與您的代碼進行比較。 –

回答

1

在大多數鏈表實施方式中,指針指向的節點,而不是一個指針:

+------+ 
| prev | 
+------+ 
| data | 
+------+ 
| next | 
+------+ 

+------+   +------+   +------+ 
| 0 | +------|  | +------|  | 
+------+ |  +------+ |  +------+ 
| A |<--+ +-->| B |<--+ +-->| C | 
+------+  | +------+  | +------+ 
|  |------+ |  |------+ | 0 | 
+------+   +------+   +------+ 

在您的代碼中,您正在使先前的指針指向下一個指針而不是之前的節點

編輯1:實施例

node * ptr_node = new node; 
ptr_node->prev = nulptr; 
ptr_node->next = nulptr; 
// Insert at the head 
ptr_node->prev = head_pointer; 
ptr_node->next = head_pointer->next; 
head_pointer = ptr_node; 

鏈表是,IMHO,更好繪製(圖片)掌握概念。通過上面的例子並「繪製」每一步。