因此,当我尝试将 newPtr 的数据设置为等于 origPtr 的数据时,我在 for-control-structure 的第一个 lopp 中收到了一个段错误。我不确定是什么原因造成的。这可能是滥用我的指针吗?还是错字?或者我的 for 循环习语中的范围错误?
List::List(const List &aList): numNodes(aList.numNodes) {
empty = true;
forward = true;
string flag;
cout << "Copy from head to tail? (y/n): ";
cin >> flag;
if(flag=="n")
forward = false;
if(!aList.head) {
head = NULL; //aList is empty. so is this->List.
tail = NULL;
} else { // copy 1st Node.
head = new Node;
if(forward)
head->setData(aList.head->getData());
else // copy in reverse.
head->setData(aList.tail->getData());
//copy rest of List.
Node *newPtr = head; //newPtr points to last Node in new List.
//origPtr points to nodes in original List.
if(forward) {
cout << "Copying normally...\n" << endl;
for(Node *origPtr=aList.head->getNext(); origPtr!=NULL;
origPtr=origPtr->getNext()) {
newPtr = newPtr->getNext();
newPtr->setData(origPtr->getData()); //SEG FAULT
} // end for
cout << "3" << endl;
} else {
cout << "Copying in reverse order...\n" << endl;
for(Node *origPtr=aList.tail->getPrev(); origPtr!=NULL;
origPtr=origPtr->getPrev()) {
newPtr = newPtr->getNext();
newPtr->setData(origPtr->getData()); //SEG FAULT
} // end for
} // end if/else
newPtr->setNext(NULL);
} // end if/else
cout << "Done copying!\n" << endl;
} // end copy constructor
如果需要更多代码,我将进行必要的编辑。
另外,我知道 c++11 的标准是使用 nullptr。我不会将它用于此实现。我在 Ubuntu 12.04 上运行 gcc-v4.6.3,它不支持 c++11。
编辑:谢谢大家!所以我在 newPtr 指向 getNext() 之前在我的 for 循环中添加了 3 行。在将 newPtr 定义为指向 head 之后,我在下一行将 newNode 声明为指向 NULL 的 Node 指针。
newNode = new Node;
newNode->setPrev(newPtr);
newPtr->setNext(newNode);