所以首先我知道,因为标题准确地说明了我的分段错误发生的位置。当我尝试将边缘节点添加到没有边缘的顶点时。我加粗了这条线,如果有人能告诉我为什么这不起作用。
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 语句中。在tempVerticePtr
被NULL
的情况下,你的if语句将尝试检查NULL
指针的vname
,这很可能会破坏你的程序。
在这种情况下,修复程序是将if (...)
替换为 else if (...)
。