我正在尝试从一个图形文件创建一个邻接矩阵。
我需要读取一个文本文件,其中包含顶点数量,然后列出图形格式
例如:
5
0 3 2
1 0 2
1 2 2
1 4 1
第一列数字是源顶点的ID,第二列是目标顶点的ID,第三列是边的权重
所以这应该返回矩阵
0 2 0 2 0
2 0 2 0 1
0 2 0 0 0
2 0 0 0 0
0 1 0 0 0
到目前为止,我已经阅读了文本文件并获得了顶点数,但是我不确定从这里开始该怎么做。
我当前的代码:
#include <stdio.h>
#include <stdlib.h>
int main (){
printf("Enter the file contianing the graph\n");
char filename[20];
FILE *myFile;
scanf("%s",filename);
myFile = fopen (filename,"r");
int number_of_nodes, number_of_edges;
int source_id[100], target_id[100], weight[100];
int matrix[100][100];
int i;
if (myFile == NULL){
printf("File not found! Exiting...\n");
return -1;
}
else{
fscanf(myFile, "%d", &number_of_nodes);
printf("There are %d vertices.\n", number_of_nodes);
for(i = 0; i < (sizeof (source_id) / sizeof ( source_id[0] )); i++)
{
if( fscanf(myFile, "%d %d %d", &source_id[i], &target_id[i], &weight[i]) != 3)
break;
}
number_of_edges = i;
for (i = 0; i<99;i++){
for (int j = 0; j< 99; i++){
matrix[i][j]=0;
}
}
for (i = 0; i < number_of_edges; i++){
int x = source_id[i];
int y = target_id[i];
matrix[x][y] = weight[i];
matrix[y][x] = weight[i];
}
for (int y = 0; y < (number_of_nodes-1); y++){
for (int x = 0; x < (number_of_nodes -1); x++){
printf(matrix[x][y]);
printf(" \n");
}
}
}
fclose(myFile);
return 0;
}
答案 0 :(得分:0)
由于您只发布了读取文件的代码,因此我将对此进行评论并加以改进。
首先,您可以以更好的方式定义变量。在下面的代码中,我删除了您的numberArray
,而是定义了一个number_of_nodes
和三个分别用于源,目标和权重的数组。这样一来,以后便可以更轻松地引用这些数据。
第二,由于文件中没有项(边缘)的数量,因此必须通过查看返回值fscanf()
来检查读取是否成功。它返回成功读取的元素数。在您的情况下,您一次要读取3个数字,因此您可以将返回值与3进行比较。您还想在退出循环后存储i
的值,因此稍后您将知道实际读取了多少条边。
第三,使用scanf("%s")
与使用gets()
(Why is it bad?)一样糟糕。您可能应该考虑限制输入长度,例如使用scanf("%19s")
。我并没有在下面的代码中修复它,因为这不是直接的问题,但是在以后的开发中应予以考虑。
最后,为文件打开检查+1。最好确保在继续操作之前成功完成先前的操作。
这是我的固定代码:
#include <stdio.h>
#include <stdlib.h>
int main() {
printf("Enter the file contianing the graph\n");
char filename[20];
FILE *myFile;
scanf("%s", filename);
myFile = fopen(filename, "r");
int number_of_nodes, number_of_edges;
int source_id[100], target_id[100], weight[100];
int i;
if (myFile == NULL) {
printf("File not found! Exiting...\n");
return -1;
}
else {
fscanf(myFile, "%d", &number_of_nodes);
printf("There are %d vertices.\n", number_of_nodes);
for (i = 0; i < (sizeof(source_id) / sizeof(source_id[0])); i++) {
if (fscanf(myFile, " %d %d %d", &source_id[i], &target_id[i], &weight[i]) != 3)
break;
}
number_of_edges = i;
}
fclose(myFile);
return 0;
}
接下来的操作,我将给您一些提示,而不是直接编写完整的代码。明白这一点相对容易。
您想创建一个“矩阵”,或者用C的话创建一个数组数组。简单来说,应该是这样
int matrix[100][100];
然后您可以初始化矩阵并将其重置为零:
// This is pseudo-code
for i = 0 to 99
for j = 0 to 99
matrix[i][j] = 0
然后根据您从文件中读取的内容,可以将值分配给归零矩阵。记住要分配两个值(x到y和y到x)
for edge in edges
x = edge.source
y = edge.target
matrix[x][y] = edge.weight
matrix[y][x] = edge.weight
要打印出矩阵,只需逐行进行。不要忘了在每一行之后打印换行符。
for y = 0 to (number_of_nodes - 1)
for x = 0 to (same as above)
print matrix[x][y] and a space
print a newline
如果您能理解以上所有想法,那么您就很好了。