我有一些看起来像这样的家庭主妇:
问题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。应使用名为adj_mat的字符设置Typedef,以定义相邻的矩阵大小N。
您必须编写一个名为path的函数,它接受作为参数邻接矩阵A和两个节点u和v的索引,并且当且仅当交叉点处存在有向路径(通过方向箭头)时才返回TRUE uv,树由矩阵A表示。否则返回FALSE。
例如:path(1,8)将返回TRUE。相同的路径(1,3)。另一方面,路径(3,8)将为FALSE。
必须得到一些帮助
#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时它什么都不做。
答案 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
传递给path2
,N
传递为u
,v
传递为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
我没有评论你的逻辑是否正确,但你应该在进一步说明之前解决上述问题。