2013-12-10 55 views
0

我目前的工作我的方式,通過斯坦福開放CS106B,和我遇到一個問題上作業3,B部分我給一個結構節點如下:爲什麼我的列表上的迭代失敗?

struct Node { 
string name; // my person's name 
string killer; // who eliminated me 
Node* next; // ptr to next node 
Node(string name, Node* next) {...} 
}; 

我要實現一個製作節點列表的類。我有構造函數正常工作,但是當我嘗試遍歷列表時,我的程序崩潰。我的迭代代碼:

void AssassinsList::printGameRing() { 
    Node* current; 
    for(current = ring; current->next != NULL; current = current->next) { 
     cout << endl << " " << current->name << " is targeting " << current->next->name; 
    } 
    cout << endl << " " << current->name << " is targeting " << ring->name << endl; 
} 

但是,如果我用一個for循環來的,我知道的次數,我需要一定長度的列表,它的工作原理。幫幫我?鏈接到作業pdf:http://www.stanford.edu/class/cs106b/homework/3-tiles-assassins/spec.pdf

謝謝!

+0

我以某種方式無法找到您提供的代碼中的任何錯誤。你將不得不展示更多的代碼。你的printGameRing中的 –

+0

你的地址是「next」,但是在你的結構中(你顯示的)沒有這樣的成員,如果你沒有顯示相關部分,你希望我們如何幫助你? –

+0

他在current-> next之前檢查!= NULL所以current-> next將會是你 – sam

回答

2

我猜你沒有初始化* nextnullptr。因此,對於您在節點之間設置的所有鏈接而言,它很好,但列表中的最後一個對象指向垃圾。

對不起,nullptr是C++ 11。如果你的編譯器老一點,那麼它的只是NULL

+0

啊......你說得對,先生。我過多地關注循環,注意到我的第一個下一個指針已設置爲目標,但目標未設置爲空。謝謝! – br1992

0

如果cur爲NULL或不指向任何內容,則可能會取消引用錯誤的指針,從而導致程序崩潰。另一種選擇是,作爲woolstar指出的那樣,你不必在你的列表中的終止節點,請遵守以下代碼(即指向NULL):

Node* head = new Node{0}; 
Node* cur = head; 
for (int i = 1; i <= 10; i++) 
{ 
    cur->next = new Node{i}; 
    cur = cur->next; 
} 

// Set terminating node 
cur->next = nullptr; 

// We'll iterate until cur is null 
// So if we access cur->next 
// It won't result in undefined behavior 
for (cur = head; cur != nullptr; cur = cur->next) 
{ 
    std::cout << cur->value; 
} 

// cur should be nullptr now 
if (!cur) 
    std::cout << "end of list"; 
0

您還可以使用0。呀,這不是與nullptr一樣酷,但支持。固定構造:

Node(string name_, Node* next_=0): name(name_), next(next_) {} 
0

事實上的固定長度的套環的作品,而是一個NULL終止循環不工作顯示,其可能是你有在最後一個節點的下一個字段中的無效地址。

我希望你的問題來自你的Node構造函數或你的列表代碼或它們之間的相互作用。

嘗試設置旁邊的0/nullptr在節點的構造函數,應該有所幫助。

或者,當您將第一個元素添加到列表或將任何元素添加到列表末尾時,讓列表將下一個字段設置爲0。

+0

非常感謝! – br1992