2017-07-19 35 views
-4

我基本上构建了一个可以在4个不同方向上传输的链表。重要概念如下:具有4个指针的节点的递归插入函数返回null

  • Node在此方案中的一类,有四个Node指针作为类成员。
  • DataCoordinates也是类。 Data只是节点将包含的数据。
  • raw_coordinates是新节点应该具有的坐标。
  • Position是当前节点的坐标。
  • moveNorth,moveSouth,moveEastmoveWest返回反映位置变化的新坐标。例如,位置节点可能具有坐标(0,0)。 moveNorth取得位置并返回(0,1)。

最后,我想说,我不关心子节点不指向父节点。 (即,如果节点node-> north具有返回到前一个节点的有效节点→南,则不感兴趣)。我的函数返回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

你的问题是什么?你从字面上只发布了你的pgoram的描述。 – Rakete1111

+0

当使用调试器逐步完成代码时,您观察到了什么? – user0042

+0

那么我不断收到一个分段错误,所以我想知道是否有人可以帮我修复它。 –

回答

0

我会大胆地猜测你if (node == null)分支不工作,你如何打算。

假设compare_coordinates如果当前位置是“您需要的位置”,则返回true,您将立即返回一个新节点。 这不会将新节点添加到您正在构建的网格中,因此下次尝试访问该节点时,它将再次生成。

同样,如果compare_coordinates返回false,看起来你只是放弃搜索 - 我相信你的想法可能会在当前位置添加一个新的“空”节点,然后在该节点上递归与当前参数“到你需要的地方”。所有的猜测都没有,因为没有对代码重要部分的评论和解释,但是这会导致你的网格永远不会超出单个中心节点,这可能会导致引起段错误的空指针引用。