将边缘节点添加到没有边的顶点时出现段错误

时间:2015-04-18 21:13:21

标签: c++

首先,我知道标题确切地说明了我的分段错误发生的位置。当我尝试将EdgeNode添加到没有边缘的顶点时。如果有人可以告诉我为什么这不起作用,那我正在大胆划线。

struct EdgeNode                                   
{
  VertexNode*   destination;                       
  int           weight;                            
  EdgeNode*     nextEdge;                           
};

struct VertexNode                                             
{
   string        vname;                            
   bool          mark;                               
   EdgeNode*     edgePtr;                            
   VertexNode*   nextVertex;                         
};

VertexNode* vertices = NULL;

void Graph::AddVertex(string v)
{
   VertexNode* newVertexPtr;
   VertexNode*  tempPtr;
   newVertexPtr = new VertexNode;
   newVertexPtr->vname = v;
   newVertexPtr->nextVertex = NULL;
   newVertexPtr->edgePtr = NULL;

   tempPtr = vertices;

   if ( tempPtr == NULL)
   {
     vertices = newVertexPtr;
     vertices->nextVertex = NULL;
   }
   else
   {
       while ( tempPtr->nextVertex != NULL)
       {
          tempPtr = tempPtr->nextVertex;
       }
     tempPtr->nextVertex = newVertexPtr;
   }

 }

 void Graph::AddEdge(string s, string d, int w)
 {
    EdgeNode* newEdgeNodePtr;
    EdgeNode* tempEdgePtr; 

    VertexNode* tempVerticePtr;
    VertexNode* dVerticePtr;

    tempVerticePtr = vertices;
    dVerticePtr = vertices;  

    try
    {
        newEdgeNodePtr = new EdgeNode;
        delete newEdgeNodePtr;
    }
    catch(std::bad_alloc)
    {
       throw GraphFull();
    }

    newEdgeNodePtr = new EdgeNode;
    newEdgeNodePtr->weight = w;
    newEdgeNodePtr->nextEdge = NULL;

    while(dVerticePtr != NULL)
    {
          if(dVerticePtr->vname != d)
             dVerticePtr = dVerticePtr->nextVertex;
          else if(dVerticePtr->vname == d)
          {
              newEdgeNodePtr->destination = dVerticePtr;
              break;
          }

     }

  while(tempVerticePtr != NULL)
  {
     if(tempVerticePtr->vname != s)
     {
         tempVerticePtr = tempVerticePtr->nextVertex;
     }

     if(tempVerticePtr->vname == s)
     {
         if ( tempVerticePtr->edgePtr == NULL)
         {
             ***//tempVerticePtr->edgePtr = newEdgeNodePtr***;
         }
      if ( tempVerticePtr->edgePtr != NULL)
      {
          while ( tempVerticePtr->edgePtr != NULL)
          {
              tempVerticePtr->edgePtr =  tempVerticePtr->edgePtr->nextEdge;    
          }
          tempVerticePtr->edgePtr->nextEdge = newEdgeNodePtr;
      }  
      break;
    }
}
}

1 个答案:

答案 0 :(得分:0)

我感觉您遇到的问题不在您为我们突出显示的指定代码行中。

问题出在以下几行代码中:

if(tempVerticePtr->vname != s)
{
     tempVerticePtr = tempVerticePtr->nextVertex;
}

if(tempVerticePtr->vname == s)
{
    if ( tempVerticePtr->edgePtr == NULL)
    {
        ***//tempVerticePtr->edgePtr = newEdgeNodePtr***;
    }
    ...
}

根据我的理解,您通过变量tempVerticePtr迭代链表。在第一个if语句中,如果vname不等于您的参数s,则迭代到链接列表中的下一个顶点(请注意tempVerticePtr的值可能为{{1}从那时起)。

问题出现在第二个if语句中。如果NULLtempVerticePtr,则您的if语句会尝试检查NULL指针的vname,这很可能会破坏您的程序。

此案例中的修复方法是将NULL替换为if (...)

相关问题