2015-11-06 155 views
0

在我用来创建链接列表中,我正在使用这个链接列表来存放我制作的基于文本的RPG库存,我在我的链接列表中遇到了与我的删除功能有关的错误。我想知道是否有人可以指出为什么我得到这个错误。链接列表错误,C++

void InventoryList::deleteNode(int num) 
{ 
    ListNode *previousNode; //To point to the previous node 
    ListNode *nodePtr; //to traverse the list 

    int number = 1; 

    //if the head is empty do nothing 
    if (!head) 
    { 
     return; 
    } 
    //Determine if the first node is the value 
    if (1 == num) 
    { 

     nodePtr = head->next; 
     delete head; 
     head = nodePtr; 
    } 
    else 
    { 
     //intialize the node as head. 
     nodePtr = head; 


     //Skip nodes whose value is not equal to num. 
     while (nodePtr != nullptr && number != num) 
     { 
      previousNode = nodePtr; 
      nodePtr = nodePtr->next; 

      number++; 
     } 
     if (nodePtr) 
     { 
     previousNode->next = nodePtr->next; 
     delete nodePtr; 
     } 
    } 
} 

我遇到这个错误与最终如果代码的语句,错误的是:

错误C4703:可能未初始化的局部指针变量“previousNode”使用

+0

它调用了这个错误,因为你只在while循环中初始化'previousNode',while循环不总是运行(即,如果'num == 0')。在while循环之前设置'previousNode = nodePtr'以及在其内部 –

+2

如果你的焦点是一个RPG游戏,使用现有的'std :: list'并减轻你重新创建你自己的链表的负担。 –

+0

非常感谢!我知道它会更容易使用std :: list,但我需要为我的类做一个(大学课 –

回答

1

纳尔的评论是正确的。在初始化PreviousNode的while循环中不能保证运行,所以指针可能未初始化 - 因此,您的错误消息。

为了解决这个问题,你需要在保证运行的块中初始化PreviousNode - no if/while/etc。

这可能会发生在任何地方,但我建议您在声明时将其设置为NULL,并检查以确保它在使用时不为空。当您声明并检查指针时,始终是一个很好的习惯来初始化。

+0

循环不会运行的唯一方法是如果nodePtr == nullptr。或数字== num。我们知道它不是number == num(因为如果是这种情况,它不会达到那个点),所以nodePtr == nullPtr是循环不会运行的唯一情况,如果发生这种情况,那么循环之后的'if'guard将确保有问题的语句不会被执行,代码是正确的,但是编译器的静态分析并不足以实现这一点(注意C4703不是错误,而是4级警告,因为使用了将警告视为错误的标志,所以这是一个错误。) –