リンクリストを使用してグラフデータ構造を作成しました。このコードで:
typedef struct vertexNode *vertexPointer;
typedef struct edgeNode *edgePointer;
void freeGraph(vertexPointer); /* announce function */
struct edgeNode{
vertexPointer connectsTo;
edgePointer next;
};
struct vertexNode{
int vertex;
edgePointer next;
};
次に、A、B、C、D の 4 つのノードを持つグラフを作成します。ここで、A は B を介して D に接続し、A は C を介して D に接続します。リンクされたリストを使用すると、次のようになると思います。
最後に、freeGraph(graph) でグラフを解放しようとします。
void freeEdge(edgePointer e){
if (e != NULL) {
freeEdge(e->next);
freeGraph(e->connectsTo);
free(e);
e = NULL;
}
}
void freeGraph(vertexPointer v){
if (v != NULL) {
freeEdge(v->next);
free(v);
v = NULL;
}
}
ここで、valgrind が「サイズ 4 の無効な読み取り」、「アドレス 0x41fb0d4 はサイズ 8 のブロック内の 4 バイトである」、「無効な free()」で不平を言い始めます。また、8回のmallocと9回の解放を行ったとも書かれています。
問題は、ノード D のメモリが既に解放されており、再度解放しようとしていることにあると思います。しかし、データ構造を変更せずにこれを正しく行う方法はありません。
可能であれば、データ構造を変更することなく、これらのエラーを防ぎ、グラフを正しく解放する最善の方法は何ですか? また、このコードに他に問題がある場合は、お知らせください。ありがとう!
あいさつ、セミコロン