我正在编写代码以从边缘列表中创建矩阵。
然而,当我运行所述代码时,我得到了一个“幻象边缘”,它不在输入数据中,这继续搞砸我程序的其余部分。矩阵中的边是9,2,或者是元素代码形式的8,1。
矩阵中的所有元素在手动之前初始化为0.
以下是与矩阵有关的输入数据:
1 2
1 8
2 8
3 5
3 1
4 5
4 6
5 2
5 9
6 4
6 8
7 4
7 10
8 4
8 6
9 4
9 5
10 7
10 3
以下是处理输入的函数:
void displayMatrix(int **matrix, int numberVertices){ //function displays the matrix
int i, j;
for(i=0; i<numberVertices; i++) //go through eveyr element
{
for(j=0; j<numberVertices; j++)
{
printf("%d ", matrix[i][j]); //print element
}
printf("\n");
}
printf("\n\n");
}
void inputMatrix(FILE *fp, int ** matrix) //file places value 1 into matrix if edge exists for the adjacency matrix
{
int e1, e2;
while(!feof(fp)) //continue to the end of the file
{
fscanf(fp, "%d %d", &e1, &e2); //get pairs
e1 = e1 - 1; //adjust the edges for array use
e2 = e2 - 1;
matrix[e1][e2] = 1; //place value 1 into appropriate location in adjacency matrix
}
fclose(fp); //close the file connection
}
0 1 0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 1 0 0
1 0 0 0 1 0 0 0 0 0
0 0 0 0 1 1 0 0 0 0
0 1 0 0 0 0 0 0 1 0
0 0 0 1 0 0 0 1 0 0
0 0 0 1 0 0 0 0 0 1
0 0 0 1 0 1 0 0 0 0
0 *1 0 1 1 0 0 0 0 0
0 0 1 0 0 0 1 0 0 0
*不应存在的条目,不在输入数据
中答案 0 :(得分:2)
问题是您需要再循环一次所需的时间,导致fscanf
在第一次转换之前失败,从而使e1
和e2
保持原来的状态读。事实证明,最后一个条目的e1
设置为10
而e2
设置为3
,因此e1
变为9
和{{1}变成e2
,从而导致幻像边缘。
这个额外循环的原因是因为你的循环条件不符合你的想法。 2
检查是否已设置文件结束标志,并且只有在尝试读取文件末尾时才能设置此标志。由于您在读取之前检查文件结尾,因此在下一次迭代之前,您实际上并未接受此操作,因此您需要再循环一次。正确的纠正非常简单;直到feof
结果为fscanf
。
EOF
答案 1 :(得分:1)
正如评论中指出的那样,您没有在fscanf
中测试错误。
特别是,在阅读10 3
之后,您还没有到达文件末尾,大概是因为遇到换行符。
然而,在下一次fscanf
周围将返回零。然后从这些值中减去1(未读取)以获得9 2
。
您可以通过执行以下操作确保读取两个整数:
if( 2 != fscanf(fp, "%d %d", &e1, &e2) ) break;
答案 2 :(得分:0)
你可以试试这个:
fscanf(fp, "%d %d\n", &e1, &e2);
当你完成最后两位数时,还有一个\n
,循环必须继续,这会造成麻烦