2017-10-22 10 views
1

こんにちは私はノードを複製して奇数のノードを削除するために、リンクリストクラスのメンバー関数を書いています。リスト内の唯一のノードである場合、リンクされたリストのヘッドを削除する。単独でリンク

1つの要素だけを含むリストの先頭を削除しようとするまで、テストケースのすべてが成功しています。

私のテストプログラムでは、何らかの理由でリストの長さが0より大きいと述べています。これは、headPtrの値を明示的にNULLに設定しているため不可能です。ここで

void RemOddDupEven(Node*& headPtr) 
{ 
Node *cur = headPtr; // current node is set to head 
Node *pred = 0;  // predecessor is NULL 

if(headPtr == 0)  // check for empty list. 
return; 

// ensures will only run 1 time if there is 1 item in list. 

while(cur != 0 && headPtr -> link != 0) // ensure there is a next link and more than 1 node in list. 
{ 

if(cur -> data % 2 == 0)   // If the value is even 
{ 
    Node *newNode = new Node;   // Create a new node 
    newNode -> data = cur -> data; // Set new Nodes data field 
    newNode -> link = 0;    // set newNode link field to NULL 

    if(cur == headPtr)    // if the current node is the head of the list 
    { 
    newNode -> link = headPtr;  // link field updated to head 
    headPtr = newNode;    // newNode becomes the new Head of the list 
    } 
     else       // current node is not the head of the list 
     { 
     pred -> link = newNode;  // update pred node to point to newNode 
     newNode -> link = cur;  // update newNode to point to current 
     } 

    pred = cur;      // update the pred node 
    cur = cur -> link;    // update the current node 
    } 


    if(cur -> data % 2 == 1)    // check if this is odd 
    { 
    Node* nextNode = 0;    // Declare Next Node and set equal to 

    if(cur -> link == 0)    // if there is no next Node then we are at the end of the list 
    { 
     delete cur;      // delete the current Node 
     cur = nextNode; 
    } 
     else{        // else there is a next node defined 
     nextNode = cur -> link;   // set the nextNode to point to next in list 
     delete cur;      // delete the current Node 
     cur = nextNode;     // assign the current Node to the next Node 
     } 

    if(pred)       // if the pred is defined 
    pred -> link = cur;    // previous node point to current node 
     else 
     headPtr = cur;     // else we're at the head of the list 
    } 
    } // end while 
}  // end method 

int listLength(Node* headPtr){ // pass by value 
    int length = 0; 

    while(headPtr !=0){ 
    length++; 
    headPtr=headPtr->link; 
    } 

    return length; 
} 
+0

この問題の原因を見つけるには、デバッガを使用する必要があります。 – aschepler

答えて

0
while(cur != 0 && headPtr -> link != 0) 

を次のようにheadPtrは、リスト内の唯一のノードである場合、リストの長さをチェックするための

My機能が一覧表示機能のための私のコードですheadPtr - > linkは実際にはnullを指しているので、それをチェックすることはそのケースを説明する最良の方法ではありません。あなたは単純なelse if()をロジックに適用することができます

if(headPtr == 0)  // check for empty list. 
    return; 

    else if(headPtr -> link == NULL){ 
     // Do some stuff to delete only this node 
    } 

    else { // handle as usual 
    // ensures will only run 1 time if there is 1 item in list. 

    while(cur != 0 && headPtr -> link != NULL) // ensure there is a next link and more than 1 node in list. 
    { 
     // The rest of your code 
    } 
    } 
+0

ありがとう!これは私の問題を解決しました! – Sap163

+0

問題が解決した場合は、緑色のチェックマークをクリックして回答を受け入れてください。問題が解決します – Callat

関連する問題