2015-05-01 101 views
-1

我已經開始學習C++,並且作爲第一個項目,我正在嘗試創建鏈接列表應用程序。迄今爲止,我還沒有對鏈表概念有過任何實際問題。無法將項目添加到循環中的鏈接列表中C++

到目前爲止,我已經有工作功能將項目添加到列表並打印它。在main()類中,我可以逐個添加項目,但是當我嘗試通過for或while循環添加多個項目時。

我有單獨的函數來創建一個項目,將其添加到(年初)名單:

ListItem createItem(int value) 
{ 
    ListItem x; 
    std::cout << &x; 
    x.value = value; 

    return x; 
} 

void addBeg(ListItem* &start, ListItem &item) 
{ 
    // Adding to an empty list 
    if (start == nullptr) 
    { 
     item.prev = &item; 
     item.next = &item; 
    } 
    else 
    { 
     std::cout << std::endl <<"X" &item; 
     item.prev = (*start).prev; 
     (*item.prev).next = &item; 
     item.next = start; 
     (*start).prev = &item; 

    } 
    start = &item; 
} 

我的main()函數如下:

int main(void) 
{ 
    using namespace std; 

    // List is empty at the beginning. 
    ListItem* start = nullptr; 

    printList(start); 

    // This doesn't work: 
    int i = 0; 
    while (i < 10) 
    { 
     ListItem a = createItem(i); 
     addBeg(start, a); 
     i++; 
    } 

    // This works: 
    addBeg(start, createItem(12)); 
    addBeg(start, createItem(13)); 
    addBeg(start, createItem(-42)); 
    addBeg(start, createItem(1)); 
    addBeg(start, createItem(-85)); 

    printList(start); 

    return 0; 
} 

我不能似乎在爲什麼它不起作用。我曾經想過的一個原因是,ListItem a在每次迭代中都不會重置,但這對我沒有任何意義。任何幫助或想法表示讚賞。

+0

鏈接列表使用*指針*。在循環中,您要添加本地作用域變量的地址,並且該地址在該循環範圍之外無效。 – crashmstr

+0

[可以訪問局部變量的內存是否可以在其範圍之外訪問?](http://stackoverflow.com/questions/6441218/can-a-local-variables-memory-be-accessed-outside-its-scope) –

+0

我沒有添加地址 - createItem返回一個ListItem對象。但即使我是,爲什麼它在單個addBeg()語句中工作得很好(在循環下面顯示)?在for循環中做什麼不同? –

回答

1

createItem功能的價值返回,和路過的時候沿着直接到另一個功能(像你如addBeg(start, createItem(12))做返回的值是臨時。拍攝並保存臨時值的一個地址會導致到未定義行爲

的簡單的解決方案是爲具有createItem使用new創建節點動態堆,並返回一個指針。

+0

應該* createItem *返回一個ListItem對象,如其定義中所指定的那樣? 另外,如果你是對的,我不知道爲什麼你提到的錯誤只能通過for循環添加項目。你引用的單行addBeg(...)工作得很好。 –

+0

@KristiánLeško未定義行爲的一個問題是,有時它可能*看起來*工作,事實上並非如此。未定義的行爲會使整個程序不合格。 –

相關問題