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

Seg fault when adding an Edge Node to a Vertex that has no Edges

本文关键字:顶点 错误 Seg 有边缘 节点 边缘 添加      更新时间:2023-10-16

所以首先我知道,因为标题准确地说明了我的分段错误发生的位置。当我尝试将边缘节点添加到没有边缘的顶点时。我加粗了这条线,如果有人能告诉我为什么这不起作用。

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;
    }
}
}

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

问题出在以下代码行中:

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

据我了解,您正在通过变量 tempVerticePtr 遍历链表。在第一个 if 语句中,如果 vname 不等于参数 s ,则迭代到链表中的下一个顶点(请注意,tempVerticePtr的值可能从该点开始NULL)。

问题出现在第二个 if 语句中。在tempVerticePtrNULL的情况下,你的if语句将尝试检查NULL指针的vname,这很可能会破坏你的程序。

在这种情况下,修复程序是将if (...)替换为 else if (...)