我刚开始学习 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;
}
这工作正常,除了三件事。
如果新添加的顶点与列表中的最后一个顶点相同,则看不到它。为了防止这种情况,我将 for 循环限制条件更改为
vert != NULL
,但这会产生段错误。如果我尝试释放临时分配的指针,它会通过指针重置内存指针,这会在顶点列表的末尾添加一个无限循环。有没有办法在不覆盖它指向的内存的情况下释放指针?还是真的不需要释放指针?
破坏图也意味着破坏每条边和顶点吗?还是有更好的方法?
此外,如果此图的数据结构不是一个好的数据结构并且有更好的实现,我将不胜感激。