【问题标题】:Segmentation fault with nodes节点分段错误
【发布时间】:2015-10-02 23:20:19
【问题描述】:

在这段代码中,当我尝试插入到链表的前面时,我一直遇到分段错误。我认为这与头部没有正确更换有关。在这个程序中,篮子是节点。我使用的调试器指出函数中的最后一行是问题,但我不确定它的来源。

include <cstdlib>
#include <iostream>
#include <ctime>
#include "BasketList.h"

using namespace std;

Basket::Basket(int _datum, Basket * _next):
   egg_num(_datum), nextBasket(_next)
{}


int Basket::getEggs() const
{
   return egg_num;
}


Basket const* Basket::getNextBasket() const
{
   return nextBasket;
}


BasketList::BasketList() :
head (NULL)
{}

void BasketList::insertBasket(int eggs)
{
   Basket *currPtr = head;
   Basket *prevPtr = NULL;
   Basket *newBasketPtr;

   if(eggs  < head->egg_num)
   {
   currPtr->nextBasket = head;
   head = currPtr;
   }


   while(currPtr != NULL && eggs > currPtr->egg_num)
   {
      prevPtr = currPtr;
      currPtr = currPtr->nextBasket;
   }

   newBasketPtr = new Basket(eggs, currPtr);
   prevPtr->nextBasket = newBasketPtr;

}

【问题讨论】:

  • 你能给我们一个minimal complete example吗?它会为我们省去很多繁琐的工作。
  • prevPtr 在您第一次插入时几乎可以肯定是 NULL。

标签: c++ list unix nodes


【解决方案1】:

您需要在使用之前测试head 是否为NULL

您的构造函数将head 设置为NULL,然后当您调用insertBasket 时,它所做的第一件事就是取消引用指针head

我认为您可以完全摆脱 insertBasket 中的第一个 if 语句(及其内容) - 循环应该执行您想要的操作。您只需要最后检查prevPtr 是否为NULL,如果是,请将head 设置为newBasketPtr

【讨论】:

  • 所以在 insertBasket 函数内部,我需要先检查 head 是否为空,然后再执行循环?
  • 你已经将currPtr设置为head,然后检查currPtr是否为NULL,所以你不需要第二次检查。问题在于您的 if 测试条件,而不是循环条件。
  • 如果原来的 if 语句是不必要的,我删除了它,那么现在问题出在哪里?既然你说问题出在第一个 if 条件下。此外,如果 currPtr 确实等于 NULL,是否需要将其设置为等于 newBasketPtr?
  • 如果 currPtr 为 NULL,那么您将不会进入循环,最后会留下 prevPtr 为 NULL 的条件。如果 head 为 NULL,或者第一项大于或等于传入的 eggs 值,则会发生这种情况。如果是这种情况(prevPtr 为 NULL),您希望将 head 设置为 newBasketPtr 而不是将 prevPtr->nextBasket 设置为 newBasketPtr。
猜你喜欢
  • 1970-01-01
  • 2017-10-24
  • 1970-01-01
  • 1970-01-01
  • 2020-04-19
  • 2018-03-29
  • 2013-11-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多