从图创建邻接矩阵

时间:2018-12-03 03:10:24

标签: c

我正在尝试从一个图形文件创建一个邻接矩阵。

我需要读取一个文本文件,其中包含顶点数量,然后列出图形格式

例如:

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;
}

1 个答案:

答案 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

如果您能理解以上所有想法,那么您就很好了。