我在C中编写了一个面包优先搜索算法,用于搜索图形结构(在这种情况下表示街道网格)并返回从节点A到节点B的所有可能路径。
我发现这个函数对于小图形(大约24个节点)非常快速地工作,但是对于大于此的任何东西都会崩溃。我认为这是一个有太多mallocs的问题,所以我在我的函数中添加了free()来在队列中运行时删除空间。遗憾的是,这并没有解决问题。另请注意,我从来没有收到错误消息“Out of memory”,所以我不确定发生了什么......
void BFS_search(struct map *m, int start, int end){
int n = m->nb_vertice+1;
int i=0;
int num=0;
//BFS requires a queue (pile) to maintain a list of nodes to visit
struct queue {
int current_node;
int visited[n]; //cannot be a pointer! Otherwise the pointer may influence other queue structures
struct queue *suivant;
};
//Function to add a node at the end of the queue.
void addqueue (int value, struct queue *old, int * old_seen) {
int i;
if (old->suivant==NULL){
struct queue *nouveau;
nouveau = (struct queue *)malloc(sizeof(struct queue));
if (nouveau == NULL){
printf("\n\nSnap! Out of memory, exiting...\n");
exit(1);
}
nouveau->current_node = value;
for (i = 0; i <= n; ++i){
if (old_seen[i]==1)
nouveau->visited[i]=1;
else nouveau->visited[i]=0;
}
nouveau->suivant = NULL;
old->suivant=nouveau;
return;
}
else addqueue(value,old->suivant,old_seen);
}
struct queue * dequeue (struct queue *old){
struct queue *nouveau;
nouveau = (struct queue *)malloc(sizeof(struct queue));
if (nouveau == NULL){
printf("\n\nSnap! Out of memory, exiting...\n");
exit(1);
}
nouveau = old->suivant;
free(old);
return(nouveau);
}
//the actual Breadth First Search Algorithm
int BFS(struct map *m, struct queue *q, int num, int end){
int k;
q->visited[q->current_node]=1; //mark current node as visited
while(q!=NULL){
//if we reached the destination, add +1 to the counter
if (q->current_node==end){
num+=1;
}
//if not the destination, look at adjacent nodes
else {
for (k=1;k<n;++k)
if (m->dist[q->current_node][k]!=0 && q->visited[k]!=1){
addqueue(k,q,q->visited);
}
}
//if queue is empty, stop and return the number
if (q->suivant==NULL){
return(num);
}
//if queue is not empty, then move to next in queue
else
return(BFS(m,dequeue(q),num,end));
}
}
//create and initialize start structure
struct queue *debut;
debut = (struct queue *)malloc(sizeof(struct queue));
for (i = 0; i <= n; ++i)
debut->visited[i]=0;
debut->current_node=start;
debut->visited[start]=1;
debut->suivant = NULL;
num=BFS(m,debut,0,end);
printf("\nIl existe %d routes possibles! \n",num);
}
请注意,我正在使用结构图,它存储我的图形的所有边和节点,包括nb_vertices(节点数)和距离矩阵dist [i] [j],它是距节点的距离i到j,如果没有连接则为0。
任何帮助将不胜感激!我认为这是可用内存量的错误。如果我无法避免内存问题,我至少想要一种输出特定错误信息的方法......
答案 0 :(得分:2)
您的dequeue
操作正在泄漏内存。您malloc
了一些内存并将指针存储在nouveau
中,但是您说nouveau = old->suivant
,丢失了malloc
'd缓冲区。从链接列表的前面弹出时,根本不需要malloc
:
struct queue *dequeue(struct queue *q)
{
struct queue *next = q->suivant;
free(q);
return next;
}
至于为什么你没有得到“内存不足”的错误,我猜你是在Linux上,而你正在经历overcommit的悲伤效果。