2016-04-08 35 views
0

此函數是鏈接列表的複製構造。代碼在第一次while循環中的某個地方放棄,它只是創建新的鏈接列表,不確定是什麼導致它,並且讚賞任何幫助。另外讓我知道你是否需要別的東西。謝謝。爲什麼我一直在爲我的鏈接列表的複製構造函數發生分段錯誤?

DLL::DLL(DLL& n) { 
    if (n.headPtr == NULL) { 
     headPtr = NULL; 
    } 
    else { 
     //keeps track of the last node in the list               
     Node* lastNode = NULL; 
     //keeps track of old list                   
     Node* oldListNode = n.headPtr; 

     while (oldListNode != NULL) { 
      //create a new Node for new list until reaches end of old list        
      Node* newNode = new Node; 
      newNode->pred = NULL; 
      newNode->succ = NULL; 
      newNode->ssn = oldListNode->ssn; 
      newNode->name = oldListNode->name; 
      //add newNode to new List                  
      if (headPtr == NULL) { //new list is empty              
       headPtr = newNode; 
       lastNode = headPtr; 
      } 
      else { 
       //adds new node to the end of the list              
       lastNode->succ = newNode; 
       newNode->pred = lastNode; 
       lastNode = newNode; 
      } 
      //Goes to the next node in the old list;              
      oldListNode = oldListNode->succ; 
     } 
    } 
    //now puts all information from old list into new list            
    itemCount = n.itemCount; 
    if (n.headPtr == NULL) { 
     headPtr = NULL; 
    } 
    else { 
     if (n.itemCount > 0) { 
      cout << "in while loop, "; 
      Node *origList = n.headPtr; //pointer accessing old node's data      
      Node *secondHeadPtr = new Node; //second hptr for new ll       
      Node *currNode = secondHeadPtr; // points to second ll node that will be filled  
      Node *nextNode; //going to point to added node          
      while (currNode != NULL) { 
       cout << "in while loop, "; 
       nextNode = new Node; //next node, currnode to point to       
       currNode->ssn = origList->ssn; 
       currNode->name = origList->name; 
       currNode->succ = nextNode; //create beginning of second ll, next node   
       nextNode->pred = currNode; 
       currNode = currNode->succ; 
       origList = origList->succ; 
       cout << currNode->name << " " << currNode->ssn << " "; 
      } 
     } 
    } 
} 

頭文件

#include <string> 
using namespace std; 

struct Node { 
    string ssn; 
    string name; 
    Node* succ; 
    Node* pred; 
}; 

class DLL { 
private: 
    Node* headPtr; 
    int itemCount; 

public: 
    DLL(); 
    DLL(DLL& n); 
    virtual ~DLL(); 
    Node* getHeadPtr(); 
    int search(string ss) const; 
    bool insert(string ss, string name, int & count); 
    bool remove(string ss, int & count); 
    int size(); 
    void display(); 
}; 

測試文件

#include "DLL.h" 
#include <iostream> 
#include <string> 

using namespace std; 

int main() { 

    DLL myList; 
    int counter = 0; 
    int dCounter = 0; 

    myList.insert("30", "Jack Eblin", counter); 
    myList.insert("40", "Liz Smith", counter); 
    myList.insert("10", "Mike Dutter", counter); 
    myList.insert("20", "Kitty Lekberg", counter); 
    myList.insert("50", "Carma Meshew", counter); 

    cout << "After insertion, we should have 10 20 30 40 50 in order" << endl; 
    myList.display(); 

    cout << "Searching 30 in the list, result should be 2" << endl; 
    cout << myList.search("30") << endl; 

    myList.remove("10", dCounter); 
    myList.remove("50", dCounter); 

    cout << "After deletion, we should have 20 30 40 in order" << endl; 
    myList.display(); 


    cout << "Testing copy constructor" << endl; 
    DLL* temp = new DLL(myList); 

    cout << "Contents of the original list" << endl; 
    myList.display(); 

    cout << "Contents of the new list, the memory address of the this list must be different from the\ 
    original list" << endl; 

    if (myList.getHeadPtr() != nullptr) { 
     temp->display(); 
    } 
    return 0; 
} 
+0

你的拷貝構造函數實際上應該採用'const DLL&'參數。 –

+4

嘗試調試它。 「某處」不是很有幫助。 – 2016-04-08 17:50:59

+5

不一致的縮進和較差的代碼質量是同伴。您需要學習更加勤奮的代碼,並且格式將自動改進。 – IInspectable

回答

3

看起來你從來沒有在拷貝構造函數設置headPtr正確。由於我們在複製構造函數中,所有類成員都不會初始化,直到初始化它們。這意味着headPtr可能是任何事情,只是設置它的值是未定義的行爲。當你到

if(headPtr == NULL) 

headPtr仍未intialized,所以我們不知道會發生什麼。更有可能它會有某種價值,不會是NULL,如果它確實那麼你的副本中的headPtr將永遠不會被設置。

+0

,這是合理的原因,正確的地方,我得到seg故障,謝謝 – Tom

+0

@Tom沒問題。 – NathanOliver

+0

@Tom如果有意義並解決了問題,您應該接受答案;-) –

相關問題