C の学習を始めたばかりで、自己学習の演習として、C でデータ構造とアルゴリズムを実装しています。現在、グラフに取り組んでおり、これがそのデータ構造表現です。
typedef int graphElementT;
typedef struct graphCDT *graphADT;
typedef struct vertexTag
{
graphElementT element;
int visited;
struct edgeTag *edges;
struct vertexTag *next;
} vertexT;
typedef struct edgeTag
{
int weight;
vertexT *connectsTo;
struct edgeTag *next;
} edgeT;
typedef struct graphCDT
{
vertexT *vertices;
} graphCDT;
このグラフに addVertex 関数を追加しました。
int addVertex(graphADT graph, graphElementT value)
{
vertexT *new = malloc(sizeof(*new));
vertexT *vert;
new->element = value;
new->visited = 0;
new->edges = NULL;
new->next = NULL;
int i = 0;
for(vert=graph->vertices; vert->next != NULL; vert=vert->next)
{
if(vert->element == value)
{
printf("already exists\n");
return 0;
}
}
vert->next = new;
//free(new);
printf("\ninserted %d\n", vert->element);
return 1;
}
これは、3つのことを除いて正常に機能します。
新しく追加された頂点がリストの最後の頂点と同じである場合、それは認識されません。これを防ぐために、for ループの制限条件を に変更しました
vert != NULL
が、これにより seg fault が発生します。一時的に割り当てられたポインターを解放しようとすると、ポインターによってメモリ ポインターがリセットされ、頂点リストの最後に無限ループが追加されます。ポインタが指すメモリを上書きせずにポインタを解放する方法はありませんか? それとも、ポインターを解放する必要はありませんか?
また、グラフを破棄すると、すべてのエッジと頂点が破棄されることになりますか? またはより良いアプローチがありますか?
また、グラフのこのデータ構造が適切なものではなく、より良い実装があれば、指摘していただければ幸いです。