邻接矩阵找到neighbores

时间:2015-04-25 14:39:38

标签: c matrix adjacency-matrix

我有一些看起来像这样的家庭主妇:

问题1(第一个程序adjacency.c文件)

有向树结构T有N个节点由邻接矩阵A大小NxN表示如下:

A [ u ] [ v] == TRUE当且仅当在T中存在从u到v的有向弧,或者换句话说: u是v的父级。在这个example树中,N = 11个节点。

我们获得以下neighboring matrix

问题是:

  1. 您必须使用#define命令定义和/或枚举N并且永久为TRUE和FALSE。应使用名为adj_mat的字符设置Typedef,以定义相邻的矩阵大小N。

  2. 您必须编写一个名为path的函数,它接受作为参数邻接矩阵A和两个节点u和v的索引,并且当且仅当交叉点处存在有向路径(通过方向箭头)时才返回TRUE uv,树由矩阵A表示。否则返回FALSE。

  3. 例如:path(1,8)将返回TRUE。相同的路径(1,3)。另一方面,路径(3,8)将为FALSE。

    1. 首先,您必须编写一个函数(main)定义变量类型adj_mat,询问此矩阵的用户条目以及两个节点的索引。主函数函数调用路径,查看数据中两个节点之间是否存在有向路径。打印测试结果输出的功能。
    2. 必须得到一些帮助

      #include <stdio.h>
      
      #define N 11
      enum {FALSE, TRUE};
      typedef int adj_mat[N][N];
      
      int path2(adj_mat A, int u, int v, int temp)
      {
      if(u == temp && A[u][v] == FALSE)
      return TRUE;
      
      if(u == temp && A[u][v] == FALSE)
      return FALSE;
      
      if(A[u][v] == FALSE)
      return path2(A, u-1, v, temp);
      
      if(A[u][v] == TRUE)
      return path2(A, N, u, temp);
      
      return FALSE;
      }
      
      int path(adj_mat A, int u, int v)
      {
      return path2(A, N, v, u);
      }
      
      
      
      int main()
      {
      
      int arr[N][N]= {{0,1,1,1,0,0,0,0,0,0,0},{0,0,0,0,1,1,1,1,1,0,0},
      {0,0,0,0,0,0,0,0,0,1,0},{0,0,0,0,0,0,0,0,0,0,1},{0,0,0,0,0,0,0,0,0,0,0},
      {0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0},
      {0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0}};
      int u;
      int v;
      printf("please enter two numbers \n");
      scanf("%d %d", &u, &v);
      printf("The answer is %d", path(arr, u, v),".");
      return 0;
      }
      

      问题出现在终端,当我把它放在1.8时它什么都不做。

1 个答案:

答案 0 :(得分:0)

您有很多问题需要尝试超出arr的结尾,导致未定义的行为。首先,当您声明具有N = 11元素的数组时,您的数组索引为arr[0] - arr[10]。请考虑path中的以下内容:

     return path2 (A, N, v, u);

您将A, N, v, u作为参数传递给path2

int path2 (adj_mat A, int u, int v, int temp)

然后在path2中,您尝试A[u][v] 错误,即超出数组末尾的A[11][v]。 (未定义的行为)。看看参数的顺序。 A A传递给path2N传递为uv传递为v,{{1} } u,制作temp

接下来,以下两种情况都不正确:

u = 11

你想要什么?这是什么?

    if (u == temp && A[u][v] == FALSE)
        return TRUE;

    if (u == temp && A[u][v] == FALSE)
        return FALSE;

甚至不会编译(见下文)。编译时,请确保启用警告,至少 printf("The answer is %d", path(arr, u, v),"."); ,这将有助于指出代码中的问题。

最后,请向用户提供有关允许数量范围的一些指导,并检查-Wall -Wextra返回

scanf

我没有评论你的逻辑是否正确,但你应该在进一步说明之前解决上述问题。