【发布时间】:2013-06-01 19:14:57
【问题描述】:
我刚开始学习 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,但这会导致段错误。如果我尝试释放临时分配的指针,它会通过指针重置内存指针,这会在顶点列表的末尾添加一个无限循环。有没有办法在不覆盖它指向的内存的情况下释放指针?还是真的不需要释放指针?
破坏图也意味着破坏每条边和顶点吗?还是有更好的方法?
另外,如果这个图形数据结构不是一个好的数据结构并且有更好的实现,我会很感激指出。
【问题讨论】:
-
int addVertex(graphADT graph- 你的意思是graphCDT吗? -
for(vert=graph->vertices; vert->next- 在使用之前确保graph->vertices不为 NULL。vert->element == value- 你没有提供graphElementT实现,所以很难说这里发生了什么。printf("\ninserted %d\n", vert->element);- 你在这里打印错误的顶点,应该是new->element -
另外,避免使用
new作为标识符,因为它是 C++ 中的关键字 -
哦,糟糕,我有一个
typedef graphCDT *graphADT; typedef char graphElementT。我也知道它是 C++ 中的一个关键字,但它在 C 中真的很重要吗? -
将来是否有可能将您的项目转换为 C++。否则就是不好的风格。
标签: c pointers data-structures graph segmentation-fault