Reputation: 23
This function is the copy construct of a linked list. The code aborts somewhere in that first while loop where it simply is just making the new linked list, not sure what is causing it and any help is appreciated. Also let me know if you need anything else. Thanks.
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 << " ";
}
}
}
}
Header file
#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();
};
Test File
#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;
}
Upvotes: 0
Views: 133
Reputation: 180500
It looks like you never set the headPtr
correctly in the copy constructor. Since we are in a copy constructor none of the class members are initialized until you initialize them. That means headPtr
could be anything and doing anything but setting it's value is undefined behavior. When you get to
if(headPtr == NULL)
headPtr
still hasn't been intialized so we have no idea what is going to happen. More than likely it will have some sort of value that will not be NULL
and if it does then your headPtr
in your copy will never be set.
Upvotes: 3