邻接矩阵查找是否有邻居

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.

问题是:

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

  2. 您必须编写一个名为 path 的函数,该函数接受邻接矩阵 A 和两个节点 u 和 v 的索引以及 returns TRUE 当且仅当存在定向路径(通过方向箭头)在交叉点 u v,树由矩阵 A 表示。否则它 returns FALSE.

例如:路径 (1,8) 将 return 为真。相同的路径 (1,3)。另一方面,路径 (3,8) 将为 FALSE。

  1. 首先你必须写一个函数(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 传递给 path2N 作为 u 传递,v 作为 v 传递,utemp,使得 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");

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