2016-04-08 21 views
0

Bu işlev, bağlantılı bir listenin kopya yapısıdır. Bu kod, ilk önce bir yerde durur, sadece yeni bağlantı listesi oluşturuyor, neyin neden olduğuna emin değilsiniz ve herhangi bir yardım takdir ediliyor. Başka bir şeye ihtiyacınız olursa lütfen bana bildirin. Teşekkürler. Eğer kopya kurucu doğru headPtr atmadı gibiBağlantılı bir listenin kopya yapıcı işlevim için neden bölümleme hatası alıyorum?

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 << " "; 
      } 
     } 
    } 
} 

Başlık dosyası

#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(); 
}; 

Testi Dosya

#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

Kopya yapıcınız gerçekten bir 'const DLL &' argümanı almalıdır. –

+4

Hata ayıklamayı deneyin. "Bir yerlerde" çok yardımcı olmuyor. –

+5

Tutarsız girinti ve kötü kod kalitesi yoldaştır. Kodunuzla daha çalışkan olmayı öğrenmelisiniz ve biçimlendirme otomatik olarak gelişecektir. – IInspectable

cevap

3

görünüyor. Kopya oluşturucuda olduğumuzdan, bunları başlatana kadar sınıf üyelerinden hiçbiri başlatılmaz. Bu, headPtr'un bir şey olabileceği ve herhangi bir şey yapabildiği anlamına gelir, ancak değerinin ayarlanması, tanımlanmamış bir davranıştır. Hala intialized edilmemiştir

if(headPtr == NULL) 

headPtr geldiğinizde bu yüzden ne olacak hiçbir fikrim yok. Muhtemelen daha fazla NULL olmayacak bir tür değer olacaktır ve eğer o zaman kopyanızdaki headPtr asla ayarlanmayacaktır.

+0

boş olduğunu neden olduğu doğruysa, bu nedenle ilk hata, – Tom

+0

@ Tom Sorun değil. – NathanOliver

+0

@Bu mantıklı ve sorunu çözerse, cevabı kabul etmelisiniz ;-) –

İlgili konular