我正在构建一个可以在4个不同方向上行进的链接列表。重要概念如下:
Node
是此方案中的一个类,其中有四个Node
指针作为类成员。Data
和Coordinates
也是课程。 Data
只是节点将包含的数据。raw_coordinates
是新节点应具有的坐标。Position
是当前节点的坐标。moveNorth
,moveSouth
,moveEast
和moveWest
会返回反映位置变化的新坐标。例如,位置节点可能具有坐标(0,0)。 moveNorth
获取位置并返回(0,1)。 最后,我想说明我并不关心子节点没有指向父节点。 (即如果节点,node-> north,有一个有效的node-> south返回到前一个节点,则不感兴趣。)
问题是我的函数返回null
。这是我的代码:
Node* Map::insertNode(Node *node, Data raw_data, Coordinates raw_coordinates, Coordinates position)
{
if (node == NULL)
{
if (compare_coordinates(raw_coordinates, position))
{
return (newNode(raw_data, raw_coordinates));
}
else
{
return node;
}
}
else
{
if (insertNode(node->north,raw_data, raw_coordinates, moveNorth(position)) != NULL)
{
node->north = insertNode(node->north, raw_data, raw_coordinates, moveNorth(position));
}
else if (insertNode(node->south,raw_data, raw_coordinates, moveSouth(position)) != NULL)
{
node->south = insertNode(node->south, raw_data, raw_coordinates, moveSouth(position));
}
else if (insertNode(node->west, raw_data, raw_coordinates, moveWest(position)) != NULL)
{
node->west = insertNode(node->west, raw_data, raw_coordinates, moveWest(position));
}
else if (insertNode(node->east, raw_data, raw_coordinates, moveEast(position)) != NULL)
{
node->east = insertNode(node->east, raw_data, raw_coordinates, moveEast(position));
}
return node;
}
}
答案 0 :(得分:0)
我猜测你的if (node == null)
分支机构没有按你的意图工作。
假设 compare_coordinates
如果当前位置是“您需要的位置”,则返回true,您将立即返回一个新节点。 这不会将新节点添加到您正在构建的网格中,因此下次您尝试访问该节点时,它将再次生成。
同样,如果compare_coordinates
返回false,看起来你只是放弃了搜索 - 我相信你想到的方法可能会在当前位置添加一个新的“空”节点,然后递归在该节点上使用当前参数“到达您需要的位置”。
所有推测,因为没有对代码的重要部分没有评论和解释,但这会导致您的网格永远不会扩展到单个中心节点之外,这可能导致空指针解引用导致段错误。