我有以下代码,并试图编写以下方案的修复程序:在参数中传递的数字不存在于列表中,因此它没有以前的使用数据获取以前的指针C++链表
这个功能应该:接受一个值 其将用于遍历列表和它发现其数据是 相同的第一个节点,将一个指针的匹配节点之前返回到ListNode。
//return a pointer to the ListNode before the matching node data
template < typename NODETYPE >
ListNode <NODETYPE> * List <NODETYPE>::prevPointerUsingData(NODETYPE &data) {
ListNode <NODETYPE> *previousPtr = NULL;
ListNode <NODETYPE> *currentPtr = firstPtr;
//first node cannot have a previous
if(data == currentPtr->data) {
cout << "canot have a previous node" << endl;
return 0;
}else {
//traverse until you've met the previous' node's data
while (currentPtr->nextPtr != NULL) {
if(currentPtr->nextPtr->data == data){
//previous is assigned the current node
previousPtr = currentPtr;
currentPtr = currentPtr->nextPtr;
cout << previousPtr->data << " <--previousData" << endl;
return previousPtr;
}else {
currentPtr = currentPtr->nextPtr;
}
}if(currentPtr->nextPtr == NULL && currentPtr->nextPtr->data != data) {
cout << "no such node" << endl;
return 0;
}
}
}
如果我输入一个数字(数据)像什么,这不是我的列表中,它崩溃。某处有逻辑错误吗?
编辑: 我写了这个代码工作的,虽然加入IF
检查,看是否列表为空,如果是,则返回0,我采取这一代码及以上的将其应用到一个即时通讯思想,仅仅因为它做同样的事情,除了上面的使用来自节点的数据,下面的使用指针。
这个函数应该:接受一个int,指定列表中一个节点的 位置,并返回一个指向该节点之前的ListNode的指针。
//return pointer to the ListNode before that node
template < typename NODETYPE >
ListNode <NODETYPE> * List <NODETYPE> ::prevPointerUsingPosition(int position) {
ListNode <NODETYPE> * previousPtr = NULL;
ListNode <NODETYPE> * currentPtr = firstPtr;
if(position < 1) {
return 0;
}else if(position > sizeOfList()) {
return 0;
}else {
for(int i = 1; i < position-1; i++) {
currentPtr = currentPtr->nextPtr;
}
previousPtr = currentPtr;
currentPtr = currentPtr->nextPtr;
cout << previousPtr->data << " <--previousData" << endl;
return previousPtr;
}
}
解决此类问题的正确工具是您的调试器。在*堆栈溢出问题之前,您应该逐行执行您的代码。如需更多帮助,请阅读[如何调试小程序(由Eric Lippert撰写)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)。至少,您应该\编辑您的问题,以包含一个[最小,完整和可验证](http://stackoverflow.com/help/mcve)示例,该示例再现了您的问题,以及您在调试器。 –
它在哪一行崩溃?调试器告诉你什么? –
你的代码中有两个明显的冗余。其中一个是'else',由于前一个块以'return'结尾,因此不需要。另一个是'if'中'currentPtr-> nextPtr == NULL'的测试 - 你已经知道它是因为这是前一个'while'循环结束的唯一条件。这些冗余使代码更难理解。 –