2017-02-20 76 views
0

我在C++程序中有以下鏈接列表。我認爲它的構建正確。類型「節點*」的C++鏈接列表參數難以處理

struct Node 
{ 
    int data; 
    Node* next = NULL; 
}; 
void addNode(Node *head, int data); 

int main() 
{ 
    struct Node 
    { 
     int data; 
     Node* next = NULL; 
    }; 

    Node *head = new Node; 
    head->data = 3; 
    addNode(head, 5); 

    system("pause"); 
    return 0; 
} 


void addNode(Node *head, int data) 
{ 
    Node *curr = head; 
    while (curr->next != NULL) 
    { 
     curr = curr->next; 
    } 
    Node *newnode = new Node; 
    curr->next = newnode; 
} 

首先我創建了一個節點結構,然後我創建了一個head並將其設置爲一個new Node.我也剛剛設置的head->data = 3。然後我打電話給我的addNode函數,該函數接受Node * head,並且基本上將一個節點添加到鏈表的末尾。但是,當我通過頭,在聲明addNode(head, 5),我得到一個錯誤說'void addNode(Node *,int)': cannot convert argument 1 from 'main::Node *' to 'Node *'

這是爲什麼?這對我沒有意義。

+3

爲什麼你再次在'main()'裏面定義'Node'?這是無關緊要的,與原來無關。 – songyuanyao

+0

當我初始化原型時,它不知道Node是什麼時候,所以我需要再次創建結構 –

+1

你是什麼意思'初始化原型'?哪個原型?對於你顯示的代碼,只要刪除'main()'裏面的定義就沒有問題。 – songyuanyao

回答

1

這只是一個普遍的範圍問題。在您的addNode函數中,正在使用的struct Node是在main()之前聲明的函數。但是,main函數中的代碼使用main範圍內的重新定義的struct Node ...因此錯誤號爲cannot convert main::Node* to Node*

main中刪除struct Node的定義,它應該可以工作。

另外,在您的addNode函數中,您沒有設置新的Node的數據值,因此請確保這樣做。

0

只是刪除了以下內容:

struct Node 
{ 
    int data; 
    Node* next = NULL; 
}; 

您的問題是你定義一個單獨的類型有不同的範圍。你的編譯器認爲第一個定義是類似於global::Node的東西,而第二個定義是main::Node

所以,實際上,當你爲頭指定一個值時,你正在分配不兼容的類型(global::Node* = main::Node*),所以你的編譯器會拋出一個錯誤。

+0

謝謝。另外我有一個quatsion。 'Node * head = new Node;'和'Node * head = new Node()之間的區別是什麼?它們似乎都起作用 –

+0

括號稱爲數據類型的初始化函數,或「構造函數」。 http://en.cppreference.com/w/cpp/language/initialization 只要可能,您應該始終初始化變量。否則會導致未定義的行爲。有關更詳細的解釋,請查看: https://en.wikipedia.org/wiki/Resource_acquisition_is_initialization –

+0

我將以示例添加此評論。假設你有'struct Foo {int bar;};',並且它有一個初始化器,當你聲明它時''foo.bar'設置爲'0'。調用'x = new Foo'會將'x-> bar'的值設置爲未定義的值,而調用'x = new Foo()'將每次都將'x-> bar'設置爲'0'。 –