这导致了我的分段错误,每当我注释掉breadthFirst=queue_enqueue(breadthFirst,n(或breadthFirst=queue_dequeue(breadhFirst(时,我就不再得到seg错误,但它显然无法再解决我的任务。
我想这可能很难帮助我,除非你知道数据类型是如何实现的,但我想我可能会尝试一下,看看我是否明显缺少了什么。
bool find_path(graph *g,node *src, node *dest) {
queue *breadthFirst = queue_empty(NULL);
breadthFirst = queue_enqueue(breadthFirst,src);
while (!queue_is_empty(breadthFirst))` {
void *v = queue_front(breadthFirst);
g = graph_node_set_seen(g,v,1);
dlist *neighbours = graph_neighbours(g,v);
dlist_pos pos = dlist_first(neighbours);
while (!(dlist_is_end(neighbours,pos))) {
void *n = dlist_inspect(neighbours,pos);
if (graph_node_is_seen(g,n)) {
}
else {
breadthFirst = queue_enqueue(breadthFirst,n);
}
pos = dlist_next(neighbours,pos);
}
breadthFirst = queue_dequeue(breadthFirst);
}
}
struct queue {
list *elements;
};
queue *queue_empty(free_function free_func)
{
// Allocate the queue head.
queue *q=calloc(1, sizeof(*q));
// Create an empty list.
q->elements=list_empty(free_func);
return q;
}
queue *queue_enqueue(queue *q, void *v)
{
list_insert(q->elements, v, list_end(q->elements));
return q;
}
queue *queue_dequeue(queue *q)
{
list_remove(q->elements, list_first(q->elements));
return q;
}
void *queue_front(const queue *q)
{
return list_inspect(q->elements, list_first(q->elements));
}
根据请求,我添加了队列实现
试着这样修改queue_empty
函数:
queue *queue_empty(free_function free_func)
{
// Allocate the queue head.
queue *q=calloc(1, sizeof(queue));
// Create an empty list.
q->elements=list_empty(free_func);
return q;
}
解决了它!尽管有这些建议,但我提供的信息还不足以让任何人真正帮助我。我做了一些调试,发现我基本上误解了我的实现。
*n是结构中的值
*src-i发送的,是一个具有值和列表的节点
所以它在第一次迭代中工作得很好,但后来我试图从*n中找到一个列表,它只是一个void值,而不是struc或列表。然后,我的程序尝试首先使用该列表,这导致了分段错误。
修复方法是使用n值来使用我拥有的函数,以找到与该值对应的结构。