2016-10-04 39 views
2

我試圖將項目添加到列表的前面。基本上,我在這裏要做的是:C++以可能的清潔程序將項目添加到鏈接列表

  • 從空列表開始;

  • 閱讀數字;

  • 調用函數,其中創建新節點以存儲該號碼,並且下一個指針指向空;

  • 如果該列表是空的,那麼這個新的節點列表(也是唯一元素)

  • 如果有更多的元素,那麼這個新的節點指向列表的頭部,成爲年初新的頭。

我的功能做什麼,我想要的(至少我可以看到,在調試器),但它返回後,我的列表是空的並且頭爲null一次。

struct node{ 
    int data; 
    node *next; 
}; 

void insert_front(node *list, int num){ 
    node * newnode = new (node); 
    newnode->data = num; 
    newnode->next = nullptr; 

    if (list == nullptr) 
     list = newnode; 
    else{ 
     newnode->next = list; 
     list = newnode; 
    } 
} 

int main() 
{ 
    int n; 
    node *head = nullptr; 

    cout << "Input numbers to store (0 finishes input): "; 
    cin >> n; 
    while (n != 0){ 
     insert_front(head, n); 
     cin >> n; 
    } 
    return 0; 
} 

也試過,但它甚至不編譯:

void insert_front(node &lst, int num){ 
    node *newnode = new node(); 
    newnode->data=num; 
    newnode->next=lst; 
    lst=newnode; 
} 

我使用OOP,模板的typedef,等等,儘可能得到一個「乾淨」的代碼,所以我有意避免可以理解一切如何運作。

+0

你傳入指針的副本列表。修改副本不會修改原始變量。通過引用傳遞指針。 –

回答

2

你需要一個指針varibable參考:節點* &列表

void insert_front(node* &lst, int num){ 
    node *newnode = new node(); 
    newnode->data=num; 
    newnode->next=lst; 
    lst=newnode; 
} 

如果你不使用你會被修改你的「樂善堂」指針的副本的引用,因此該列表會在離開此功能後,請繼續指向舊的正面。 C++中的引用參數前綴爲「&」符號。在單箇舊C中(不是你的情況),你需要一個指向指針的指針。

+0

我不知道這是可能的:D 謝謝! –

+0

請解釋_why_這是必要的。 –

+0

事實上,至少有一些元素可以解釋*出錯的地方比通過修復更有價值。 –

0

不能通過引用傳遞,因爲您不能指定給它。

node* insert_front(node* list, int val) 
{ 
    node* n = new node(); 
    n->data = val; 
    n->next= list; 
    return n; // return the new head of the list 
} 

然後插入時:

while (n != 0){ 
    head = insert_front(head, n); // head will always change every time you add to the front 
    cin >> n; 
} 

或者,你可以有你插入功能也更新list以反映新的頭,但你必須一個指針傳遞給頭指針本身:

void insert_front(node** pList, int val) 
{ 
    node* n = new node(); 
    n->data = val; 
    n->next= *pList; 
    *pList= n; 
} 


while (n != 0){ 
    insert_front(&head, n); // head will always change every time you add to the front 
    cin >> n; 
} 
+0

爲什麼不通過參考傳遞指針?您可以分配給通過引用傳遞的參數。 –

+0

你可以去任何一個方向。傳遞指針對調用者來說更加明確:「它是一個輸入/輸出參數,它可以改變」而不是參考。編譯器以任何方式生成相同的代碼。 – selbie

+0

謝謝,這是非常有用的:) –

0

您正在通過值列表。

的類比顯示方式:

int x; 
void modify_x_where_x_is_passed_by_reference(int & x_ref); 
void modify_x_where_x_is_passed_by_a_pointer(int * x_ptr); 
// Usage 
modify_x_where_x_is_passed_by_reference(x); 
modify_x_where_x_is_passed_by_a_pointer(&x); // the address of x 

// But when your variable is a pointer! 
int * y; 
void modify_y_where_y_is_passed_by_reference(int* & y_ref); 
void modify_y_where_y_is_passed_by_a_pointer(int* * y_ptr); 
// Usage 
modify_y_where_y_is_passed_by_reference(y); 
modify_y_where_y_is_passed_by_a_pointer(&y); // the address of y 
+0

很好的解釋和非常有用的。謝謝! –

相關問題