首页 文章

邻接矩阵找到neighbores

提问于
浏览
0

我有一些看起来像这样的homewrok:

Question 1 ( First program adjacency.c file )

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

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的索引,并且当且仅当交叉点uv处有一个有向路径(通过方向箭头)时才返回TRUE,树是由矩阵A表示 . 否则返回FALSE .

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

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

必须得到一些帮助的家伙

#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

    你有很多问题试图在 arr 结束之后阅读,导致 undefined behavior . 首先,当您声明一个包含 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] wrong ,即超出数组末尾的 A[11][v] . ( undefined behavior ) . 查看参数的顺序 . A 作为 A 传递给 path2N 传递为 uv 传递为 vu 传递为 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 这将有助于指出代码中的问题 .

    最后,请向用户提供有关允许数量范围的一些指导,并且 check the 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");
    

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

相关问题