将边缘节点添加到没有边缘的顶点时出现 Seg 错误
Seg fault when adding an Edge Node to a Vertex that has no Edges
所以首先我知道,因为标题准确地说明了我的分段错误发生的位置。当我尝试将边缘节点添加到没有边缘的顶点时。我加粗了这条线,如果有人能告诉我为什么这不起作用。
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 (...)
。
相关文章:
- 使用 glvertex4i 传递网格面索引时的顶点着色器错误
- 为什么顶点数组对象会导致错误?
- OpenGL 顶点缓冲区类重定义和模板方法错误
- OpenGL 透视投影裁剪多边形与顶点在视锥体之外 = 错误的纹理映射?
- 顶点着色器错误C5145:必须使用qshaderprogram写入gl_position
- GLSL 顶点着色器编译错误
- GLSL ES 顶点着色器错误
- 为什么我的顶点缓冲区对象出现访问冲突错误?
- 输入汇编程序-顶点着色器链接错误
- 间歇性GLSL顶点着色器编译错误
- 将边缘节点添加到没有边缘的顶点时出现 Seg 错误
- 包含相邻顶点列表的自定义顶点类型[图形]:不完整类型错误
- 尝试将顶点添加到自定义Graph数据结构时出现分段错误
- 错误:使用未识别的类型"顶点"
- 自定义顶点处理器不起作用 - 矩阵乘法错误或其他什么?
- 在boost中访问顶点时出现分割错误
- 更新顶点缓冲区会导致调试层错误
- 顶点着色器中的 GLSL 奇怪'<'语法错误
- HLSL顶点着色器输入错误
- OpenGl的错误.运行时立方体顶点位置错误