2011-10-26 51 views
1

在下面的代碼:什麼是Node *&aNode?

void insert(Node *& aNode, int x) { 
    if (!aNode) { 
    aNode = new Node(x); 
    aNode->next = aNode; 
    return; 
    } 

    Node *p = aNode; 
    Node *prev = NULL; 
    do { 
    prev = p; 
    p = p->next; 
    if (x <= p->data && x >= prev->data) break; // For case 1) 
    if ((prev->data > p->data) && (x < p->data || x > prev->data)) break; // For case 2) 
    } while (p != aNode); // when back to starting point, then stop. For case 3) 

    Node *newNode = new Node(x); 
    newNode->next = p; 
    prev->next = newNode; 
} 

什麼是節點* &陽極?

我應該如何使用這個函數,我的意思是,我應該傳遞哪種類型的參數?

+3

我不認爲這是有效的C.你應該重新編程爲C++。 –

+0

@ denniston.t謝謝。 Yeas –

+1

循環排序列表?這甚至有可能嗎? – Dani

回答

10

我覺得這個代碼是C++,不C和Node *&aNode是一個指針引用到Node,所以你會傳遞一個Node*的功能,和功能將使該參考(所以內存位置的Node*指向可以改變)。

您可能會感興趣the Wikipedia article on References (C++)

一個簡單的例子:

#include <iostream> 
void addOneToValue(int num) { 
    ++num; 
} 

void addOneToRef(int &num) { 
    ++num; 
} 

int main() { 
    int num = 0; 

    // print 0 
    std::cout << num << std::endl; 

    // print 0 again (addOneToValue() has no effect) 
    addOneToValue(num); 
    std::cout << num << std::endl; 

    // print 1 (addOneToRef() changes the value of num) 
    addOneToRef(num); 
    std::cout << num << std::endl; 
} 

@ crashmstr的評論提醒我,我應該說,他們是如何從不同的指針。 Wikipedia does a better job that I could though

  • 在定義它之後不可能直接引用引用對象;其名稱的任何出現都直接指向它所引用的對象。
  • 一旦創建了一個引用,就不能再引用另一個對象;它不能被重新安裝。這通常是用指針完成的。
  • 引用不能爲空,而指針可以;每個引用都指向某個對象,儘管它可能有效也可能不會有效。
  • 引用不能被初始化。由於不可能重新初始化引用,因此必須在創建引用後立即對其進行初始化。特別是,必須在定義它們的地方初始化本地和全局變量,並且作爲類實例數據成員的引用必須在類的構造函數的初始化程序列表中初始化。
  • 大多數編譯器都會支持空引用,沒有太多抱怨,只有在嘗試以某種方式使用引用時纔會崩潰。
+2

在C中,你需要有'Node ** aNode'(指向指針的指針),並且在整個代碼中會有更多*和&擴散。在C++ – crashmstr

+0

謝謝你參考一個指針可能不太容易出錯。 @crashmstr –

+0

謝謝@Brendan長,清楚的解釋。 –

相關問題