【问题标题】:adjacency matrix find if neighbores邻接矩阵查找是否邻居
【发布时间】:2015-04-25 14:39:37
【问题描述】:

我有一些看起来像这样的家庭作业:

问题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 的索引作为参数,当且仅当在交叉点存在有向路径(按方向箭头)时才返回 TRUE uv,树用矩阵A表示。否则返回FALSE。

例如:路径 (1,8) 将返回 TRUE。相同的路径 (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 时它什么也没做。

【问题讨论】:

  • 您的问题是什么?你试过什么,怎么失败了?
  • 编辑了问题。当我输入 1, 8 时,它不会在终端返回任何内容
  • 如果你纠正了问题最后一行的语法、拼写和标点符号,我会告诉你如何修复这个bug。
  • 对不起,我对编程有点陌生。你能告诉我要改变什么吗?
  • 你必须从一个更简单的练习开始。编写软件的关键是从小而简单的东西开始,然后一步一步地构建。如果你试图一口气写一个大程序,那是行不通的。试试HelloWorld,然后从那里开始。

标签: c matrix adjacency-matrix


【解决方案1】:

您在尝试阅读超出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 传递,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返回

    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");

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

【讨论】:

  • 谢谢!我会做出改变并通知你
猜你喜欢
  • 2016-04-06
  • 2022-11-16
  • 1970-01-01
  • 1970-01-01
  • 2020-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-17
相关资源
最近更新 更多