我列表中的额外优势?

时间:2012-09-17 05:23:04

标签: c algorithm graph adjacency-list adjacency-matrix

我正在编写代码以从边缘列表中创建矩阵。

然而,当我运行所述代码时,我得到了一个“幻象边缘”,它不在输入数据中,这继续搞砸我程序的其余部分。矩阵中的边是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

*不应存在的条目,不在输入数据

3 个答案:

答案 0 :(得分:2)

问题是您需要再循环一次所需的时间,导致fscanf在第一次转换之前失败,从而使e1e2保持原来的状态读。事实证明,最后一个条目的e1设置为10e2设置为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,循环必须继续,这会造成麻烦