【发布时间】:2019-02-18 22:45:33
【问题描述】:
我使用压缩的稀疏行数据结构在 C 中编写了广度优先搜索的代码。该代码似乎适用于一个图形,但返回另一个图形文件的错误。它适用于 this file,但对于 this file 会抛出错误作为 C 编程新手,我找不到问题的原因,希望能提供任何帮助
我尝试检查 while 循环的条件。当代码挂起并返回错误时,循环的条件为真。我正在使用 mingw 编译器在 CodeBlocks 16.01 上运行此代码。
#include <stdio.h>
#include <stdlib.h>
// Declaring a struct type to hold
int main(){
int n, m, counter, current, x, src, dst;
n=0, m=0, counter = 0, current =0, src = 0, dst = 0;
FILE *fp; //create a pointer to the file directory
fp = fopen("filename.graph","r"); //set the directory pointer to the path of the text file containing graph data
if ((fp == NULL)){ perror("Error, no such file exists \n"); exit(1);}
//If file not found, print error message and exit the program
else
{
fscanf(fp,"%d %d", &n,&m); //read first line of text file to get number of vertices and edges in graph
struct CSRgraph //Create CSR data structure
{
int heads[m]; //Stores heads of edges
int offsets[n+1]; //Stores information on the number of edges leaving each node
};
struct CSRgraph g; //Create an instance of the CSR graph data structure
g.offsets[0] = 0; //Set the initial offset value to 0
g.offsets[n] = m; //Set the offset value of 'phantom' node to the number of edges in graph
for(x=0;x<m;x++) //iterate over all lines containing edge information in text file
//Read file and create CSR data structure from information in text file
{
fscanf(fp,"%d %d",&src,&dst); //read source and head information from file
g.heads[x] = dst; //assign head information to the next available slot in data structure
if (src < n+1) //Check that node is valid
{
if (src == current) //check that current edge originates from same source as previous edge
{
counter++; //increment counter for the number of edges that originate from current source
}
else //Current edge does not originate from previous source. New source node encountered
{
g.offsets[src] = counter + g.offsets[src -1]; //Update offset value for previous source
counter = 1; //restart edge origin counter
current = src ; //set current to current source
}
}
}
fclose(fp); //Close file after use
int Discovered[n],Queue[n+1],Explored[n], *front_ptr,*end_ptr,*exp_ptr;
front_ptr = Queue; //Initialize the front pointer to the Queue array
end_ptr = Queue; //Initialize the end pointer to the Queue array
exp_ptr = Explored; //Initialize the explored pointer to the Explored array
for (x=0;x<n;x++)
{
Discovered[x] = 0; //An array to track discovered nodes. Not necessarily explored, but nodes that have showed up previously
}
// Advance the pointers in the direction you want
*end_ptr = 0; //setting the first element in the queue as the node 0
end_ptr++; //advancing the end pointer to the next available array spot
Discovered[0] = 1;
while (front_ptr != end_ptr)
{ //Queue is empty if front pointer is the same as end pointer
int p,curr;
curr = *front_ptr; //grab the front of the queue and set it as current node
front_ptr++; //equivalent to removing from element and pushing the next node in line to the front
*exp_ptr = curr; //set current node to explored
exp_ptr++; //advance the explored pointer one step
for (p = g.offsets[curr]; p < g.offsets[curr+1]; p++)
//iterate over all neighbors of current node
{
if (Discovered[g.heads[p]] == 0)
//if node is not already discovered, set it to discovered, add it to queue and advanced the end pointer of queue one step
{
Discovered[g.heads[p]] = 1;
*end_ptr = g.heads[p];
end_ptr++;
}
}
}
}
return 0;
}
【问题讨论】:
-
那么,您收到了什么“莫名其妙”的错误?
-
程序在一种情况下只是退出,而在另一种情况下完成运行。我应该说“莫名其妙”只是我的参考。
-
struct CSRgraph的意义何在?您只声明一个实例,然后将其用于其成员。如果不是因为不允许 struct 成员具有可变修改类型这一事实,这只会很奇怪。 -
在所谓的错误情况下,您如何判断程序“刚刚退出”?如果成功打开目标文件,我看不到它发出任何输出的任何地方。你能确定它没有完成计算吗?
-
int heads[m];作为int的 VLA 和m = 108744可能会导致 StackOverflow...(这将取决于编译器、操作系统和内存模型)
标签: c graph-algorithm breadth-first-search