此功能是链表的复制结构。代码在第一个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 :(得分:3)
看起来您从未在复制构造函数中正确设置headPtr
。由于我们在复制构造函数中,因此在初始化它们之前不会初始化任何类成员。这意味着headPtr
可以是任何东西,除了设置它的值之外什么也不做是未定义的行为。当你到达 p>
if(headPtr == NULL)
headPtr
仍然没有初始化,所以我们不知道会发生什么。很可能它会有NULL
的某种价值,如果确实如此,那么您副本中的headPtr
将永远不会被设置。