邻接矩阵查找是否有邻居
adjacency matrix find if neighbores
我有一些作业是这样的:
问题 1(第一个程序 adjacency.c 文件)
有向树结构T有N个节点,由邻接矩阵A表示,大小为NxN如下:
A [ u ] [ v] == TRUE
当且仅当 T 中存在从 u 到 v 的有向弧,或者换句话说:
u 是 v 的父级。在这个 example 中有 N = 11 个节点的树。
我们得到如下neighboring matrix.
问题是:
您必须使用#define 命令定义和/或枚举 N 和永久 TRUE 和 FALSE。 typedef 应该设置一个名为 adj_mat 的字符定义相邻矩阵大小 N.
您必须编写一个名为 path 的函数,该函数接受邻接矩阵 A 和两个节点 u 和 v 的索引以及 returns TRUE 当且仅当存在定向路径(通过方向箭头)在交叉点 u v,树由矩阵 A 表示。否则它 returns FALSE.
例如:路径 (1,8) 将 return 为真。相同的路径 (1,3)。另一方面,路径 (3,8) 将为 FALSE。
- 首先你必须写一个函数(main)定义一个变量类型adj_mat,向用户询问这个矩阵的条目,以及两个节点的索引。 main函数函数调用路径,查看数据中两个节点之间是否存在有向路径。打印测试结果输出的函数。
必须得到一些帮助
#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 时它什么也没做。
您遇到了一些问题,您试图读取超出 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
传递给 path2
,N
作为 u
传递,v
作为 v
传递,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
return:
printf ("\n please enter two numbers (0-10): ");
if (scanf (" %d %d", &u, &v) == 2)
printf ("\n The answer is %d.\n", path (arr, u, v));
else
fprintf (stderr, "error: input failure.\n");
我不评论你的逻辑是否正确,但你应该在进一步讨论之前解决上述问题。
我有一些作业是这样的:
问题 1(第一个程序 adjacency.c 文件)
有向树结构T有N个节点,由邻接矩阵A表示,大小为NxN如下:
A [ u ] [ v] == TRUE
当且仅当 T 中存在从 u 到 v 的有向弧,或者换句话说:
u 是 v 的父级。在这个 example 中有 N = 11 个节点的树。
我们得到如下neighboring matrix.
问题是:
您必须使用#define 命令定义和/或枚举 N 和永久 TRUE 和 FALSE。 typedef 应该设置一个名为 adj_mat 的字符定义相邻矩阵大小 N.
您必须编写一个名为 path 的函数,该函数接受邻接矩阵 A 和两个节点 u 和 v 的索引以及 returns TRUE 当且仅当存在定向路径(通过方向箭头)在交叉点 u v,树由矩阵 A 表示。否则它 returns FALSE.
例如:路径 (1,8) 将 return 为真。相同的路径 (1,3)。另一方面,路径 (3,8) 将为 FALSE。
- 首先你必须写一个函数(main)定义一个变量类型adj_mat,向用户询问这个矩阵的条目,以及两个节点的索引。 main函数函数调用路径,查看数据中两个节点之间是否存在有向路径。打印测试结果输出的函数。
必须得到一些帮助
#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 时它什么也没做。
您遇到了一些问题,您试图读取超出 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
传递给 path2
,N
作为 u
传递,v
作为 v
传递,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
return:
printf ("\n please enter two numbers (0-10): ");
if (scanf (" %d %d", &u, &v) == 2)
printf ("\n The answer is %d.\n", path (arr, u, v));
else
fprintf (stderr, "error: input failure.\n");
我不评论你的逻辑是否正确,但你应该在进一步讨论之前解决上述问题。