2017-04-14 102 views
-3

我的while循環不會在我的鏈表中工作,但for循環會,我正在使用for循環打印鏈接列表。但我需要一個整數來放置「n」。我試圖通過計算鏈表中的元素來實現這一點,我需要一個while循環。因爲當這個問題得到解決時,我不會首先需要for循環,我只是想在計算鏈表中的元素時使用它。雖然循環不會在我的鏈接列表中工作

int count = 0; 
    Hand *crdNode = head; 

    while (crdNode != NULL) 
    { 
     crdNode= crdNode->cardPtr; 
     count++; 
    } 
    cout<<endl; 
    return count; 

這是所有在比主之外的單獨的源文件中的函數的內部。任何幫助,將不勝感激。

工作循環:

Hand *crdNode = head; 

    for (int i = 0; i < n; i++) 
    { 
     cout<< crdNode ->card<<endl; 
     crdNode= crdNode->cardPtr; 
    } 
    cout<<endl; 

填單子功能

if (head == NULL) 
    { 
     crdNode = new Hand; 
     crdNode ->card = t; 
     temp = crdNode; 
     head = crdNode; 

    } 
    else 
    { 
     crdNode = new Hand; 
     crdNode -> card = t; 
     crdNode -> cardPtr = head; 
     head = crdNode; 
     crdNode -> cardPtr = NULL; 
    } 
+0

怎麼樣,包括for循環工作,所以我們可以比較自己呢? – John3136

+0

會做,謝謝。 –

+0

在最後一個元素中看起來'cardPtr'不是'NULL',所以while循環不會在最後一個元素之後停止。當你添加一個新元素到列表的最後時,確保你將'cardPtr'賦值爲'NULL'。 – Rogus

回答

0

只需在要插入你的「n'.The while循環是這樣的while循環添加一個條件:

while(crdNode!=NULL) 
{ 
    if(position==count) 
    { 
     //insert code 
    } 
} 
1

問題出在您的「填充列表」

if (head == NULL) 
{ 
    crdNode = new Hand; 
    crdNode ->card = t; 
    crdNode -> cardPtr = NULL; // Add this line to set the next pointer 
    // temp = crdNode;    Remove this line - temp isn't used 
    head = crdNode; 

} 
else 
{ 
    crdNode = new Hand; 
    crdNode -> card = t; 
    crdNode -> cardPtr = head; 
    head = crdNode; 
    // crdNode -> cardPtr = NULL; Remove this line - it destroys the list 
} 

的代碼可以被重寫和簡化,如:

crdNode = new Hand; 
    crdNode -> card = t; 
    crdNode -> cardPtr = head; 
    head = crdNode; 
+0

閱讀我上面的評論。您的簡化版本完全符合我在評論中所描述的內容 - 這絕不會超過兩個元素,並且會導致內存泄漏。每個以前添加的元素被新元素替換,並且前一個元素沒有任何指向! – Rogus

+0

@羅格斯 - 你錯了。此代碼將新元素插入列表的前面。 – 4386427

+0

@Rogus - 關於正在運行的版本,請參閱http://ideone.com/7lQ14O – 4386427