C语言中的静态分配邻接矩阵图
我想在邻接矩阵中放入下图: 左图是8节点网络的节点链接表示。右侧是同一网络的邻接矩阵表示。人数 灰色单元格等于图形中的链接数 所以我想做一个静态赋值邻接矩阵。在C语言中的静态分配邻接矩阵图,c,graph,adjacency-matrix,C,Graph,Adjacency Matrix,我想在邻接矩阵中放入下图: 左图是8节点网络的节点链接表示。右侧是同一网络的邻接矩阵表示。人数 灰色单元格等于图形中的链接数 所以我想做一个静态赋值邻接矩阵。在C语言中最好的方法是什么 我的想法是: int Matrix[8][8]; 然后,如果该节点已连接到其他节点,则指定1,如果未连接,则指定0。我还想为一个节点的邻居数量保留一个计数器,比如a有2个,B有3个 但所有这些我都希望是静态的而不是动态的。在C99中,使用enum和“指定的初始值设定项”: enum { A, B, C, D,
C语言中最好的方法是什么
我的想法是:
int Matrix[8][8];
然后,如果该节点已连接到其他节点,则指定1,如果未连接,则指定0。我还想为一个节点的邻居数量保留一个计数器,比如a有2个,B有3个
但所有这些我都希望是静态的而不是动态的。在C99中,使用enum
和“指定的初始值设定项”:
enum { A, B, C, D, E, F, G, H };
static const int Matrix[8][8] =
{
[A] = { [B] = 1, [C] = 1 },
[B] = { [A] = 1, [C] = 1, [D] = 1 },
[C] = { [B] = 1, [F] = 1 },
[D] = { [H] = 1 },
[E] = { [D] = 1, [F] = 1, [G] = 1 },
[F] = { [E] = 1, [G] = 1 },
[G] = { [F] = 1, [H] = 1 },
[H] = { [E] = 1, [G] = 1 },
};
这是您提供的表格的直接抄本;我还没有对照图表来验证这张表。当然,没有显式初始值设定项的元素是零的。您可以决定对齐右大括号,尽管这不是必需的;我很可能会
如果您没有C99支持,则只能手动填充2D阵列:
static const int Matrix[8][8] =
{ /* A B C D E F G H */
{ 0, 1, 1, 0, 0, 0, 0, 0 }, /* A */
{ 1, 0, 1, 1, 0, 0, 0, 0 }, /* B */
{ 0, 1, 0, 0, 0, 1, 0, 0 }, /* C */
{ 0, 0, 0, 0, 0, 0, 0, 1 }, /* D */
{ 0, 0, 0, 1, 0, 1, 1, 0 }, /* E */
{ 0, 0, 0, 0, 1, 0, 1, 0 }, /* F */
{ 0, 0, 0, 0, 0, 1, 0, 1 }, /* G */
{ 0, 0, 0, 0, 1, 0, 1, 0 }, /* H */
};
如果图形以某种文本形式呈现,则可以编写Perl、Python或Awk脚本(仅列出三种合适的语言)来自动生成输出
注意:如果要保留一个元素的邻居数计数器(我假设,这意味着可以从此节点到达的邻居数,而不是可以到达此节点的邻居数,或者向外箭头而不是向内箭头),则需要一个比简单2D数组更复杂的结构。您可能会使用一组结构:
enum { A, B, C, D, E, F, G, H };
enum { MAX_GRAPH_SIZE = 8 };
typedef struct Node
{
unsigned char n_out;
unsigned char nodes[MAX_GRAPH_SIZE];
} Node;
static const Node Matrix[MAX_GRAPH_SIZE] =
{
[A] = { .n_out = 2, .nodes = { [B] = 1, [C] = 1 } },
[B] = { .n_out = 3, .nodes = { [A] = 1, [C] = 1, [D] = 1 } },
[C] = { .n_out = 2, .nodes = { [B] = 1, [F] = 1 } },
[D] = { .n_out = 1, .nodes = { [H] = 1 } },
[E] = { .n_out = 3, .nodes = { [D] = 1, [F] = 1, [G] = 1 } },
[F] = { .n_out = 2, .nodes = { [E] = 1, [G] = 1 } },
[G] = { .n_out = 2, .nodes = { [F] = 1, [H] = 1 } },
[H] = { .n_out = 2, .nodes = { [E] = 1, [G] = 1 } },
};
我完全不相信,与计算出(或进入)一个节点的箭头数相比,节省的成本保证了额外的复杂性。值得注意的是,在引用数组元素时,您现在必须编写:
Matrix[i].nodes[j]
而不是更简单的:
Matrix[i][j]
在C99中,使用enum
和“指定的初始值设定项”:
enum { A, B, C, D, E, F, G, H };
static const int Matrix[8][8] =
{
[A] = { [B] = 1, [C] = 1 },
[B] = { [A] = 1, [C] = 1, [D] = 1 },
[C] = { [B] = 1, [F] = 1 },
[D] = { [H] = 1 },
[E] = { [D] = 1, [F] = 1, [G] = 1 },
[F] = { [E] = 1, [G] = 1 },
[G] = { [F] = 1, [H] = 1 },
[H] = { [E] = 1, [G] = 1 },
};
这是您提供的表格的直接抄本;我还没有对照图表来验证这张表。当然,没有显式初始值设定项的元素是零的。您可以决定对齐右大括号,尽管这不是必需的;我很可能会
如果您没有C99支持,则只能手动填充2D阵列:
static const int Matrix[8][8] =
{ /* A B C D E F G H */
{ 0, 1, 1, 0, 0, 0, 0, 0 }, /* A */
{ 1, 0, 1, 1, 0, 0, 0, 0 }, /* B */
{ 0, 1, 0, 0, 0, 1, 0, 0 }, /* C */
{ 0, 0, 0, 0, 0, 0, 0, 1 }, /* D */
{ 0, 0, 0, 1, 0, 1, 1, 0 }, /* E */
{ 0, 0, 0, 0, 1, 0, 1, 0 }, /* F */
{ 0, 0, 0, 0, 0, 1, 0, 1 }, /* G */
{ 0, 0, 0, 0, 1, 0, 1, 0 }, /* H */
};
如果图形以某种文本形式呈现,则可以编写Perl、Python或Awk脚本(仅列出三种合适的语言)来自动生成输出
注意:如果要保留一个元素的邻居数计数器(我假设,这意味着可以从此节点到达的邻居数,而不是可以到达此节点的邻居数,或者向外箭头而不是向内箭头),则需要一个比简单2D数组更复杂的结构。您可能会使用一组结构:
enum { A, B, C, D, E, F, G, H };
enum { MAX_GRAPH_SIZE = 8 };
typedef struct Node
{
unsigned char n_out;
unsigned char nodes[MAX_GRAPH_SIZE];
} Node;
static const Node Matrix[MAX_GRAPH_SIZE] =
{
[A] = { .n_out = 2, .nodes = { [B] = 1, [C] = 1 } },
[B] = { .n_out = 3, .nodes = { [A] = 1, [C] = 1, [D] = 1 } },
[C] = { .n_out = 2, .nodes = { [B] = 1, [F] = 1 } },
[D] = { .n_out = 1, .nodes = { [H] = 1 } },
[E] = { .n_out = 3, .nodes = { [D] = 1, [F] = 1, [G] = 1 } },
[F] = { .n_out = 2, .nodes = { [E] = 1, [G] = 1 } },
[G] = { .n_out = 2, .nodes = { [F] = 1, [H] = 1 } },
[H] = { .n_out = 2, .nodes = { [E] = 1, [G] = 1 } },
};
我完全不相信,与计算出(或进入)一个节点的箭头数相比,节省的成本保证了额外的复杂性。值得注意的是,在引用数组元素时,您现在必须编写:
Matrix[i].nodes[j]
而不是更简单的:
Matrix[i][j]
int-Matrix[8][8]
已经是静态/自动的(取决于你把它放在哪里)。int-Matrix[8][8]
已经是静态/自动的(取决于你把它放在哪里)。对于this@IanNorton; 我同意,但问题明确指出int-Matrix[8][8]代码>。unsigned char对于this@IanNorton; 我同意,但问题明确指出int-Matrix[8][8]代码>。