2016-09-09 14 views
-4

我有以下代码,并试图编写以下方案的修复程序:在参数中传递的数字不存在于列表中,因此它没有以前的使用数据获取以前的指针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; 
    } 
    } 
+0

解决此类问题的正确工具是您的调试器。在*堆栈溢出问题之前,您应该逐行执行您的代码。如需更多帮助,请阅读[如何调试小程序(由Eric Lippert撰写)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)。至少,您应该\编辑您的问题,以包含一个[最小,完整和可验证](http://stackoverflow.com/help/mcve)示例,该示例再现了您的问题,以及您在调试器。 –

+1

它在哪一行崩溃?调试器告诉你什么? –

+0

你的代码中有两个明显的冗余。其中一个是'else',由于前一个块以'return'结尾,因此不需要。另一个是'if'中'currentPtr-> nextPtr == NULL'的测试 - 你已经知道它是因为这是前一个'while'循环结束的唯一条件。这些冗余使代码更难理解。 –

回答

0

变化

if(currentPtr->nextPtr == NULL && currentPtr->nextPtr->data != data) 

if(currentPtr->nextPtr != NULL && currentPtr->nextPtr->data != data) 

另外,你应该在第一if声明取消引用之前检查firstPtr非空。

+0

我创建了另一个名为prevPointerUsingPosition的函数,它起作用,我只是试图应用相同的概念,但它没有完全工作。我将编辑上面的代码 – masterplox

3

你做下面的语句错误,

if(currentPtr->nextPtr == NULL && currentPtr->nextPtr->data != data) 

如果currentPtr->nextPtrNULL,那么你在currentPtr->nextPtr->data != data条件提领此空指针。