【问题标题】:A graph can be implemented as a list?图可以实现为列表吗?
【发布时间】:2014-11-27 02:00:54
【问题描述】:

一位老师让我在图形课上实现伦敦地铁的环线。如我所见,黄线可以表示为图形,也可以表示为循环链表。

在我的最后一个图形算法中,我创建了这个结构:

struct graph { int info; struct graph *edge[3]; };

像下面这样实现圆线图是正确的吗?或者我会将其设为链表而不是图表?

struct graph{ int info; struct graph *next; struct graph *prev; }

【问题讨论】:

  • 链表图(在软件到数学的通常映射中,对象节点和指针边)。但是你有一个名为graph 的结构,它似乎代表了一个(数学)图的片段。你在问它是否可以代表“圆线图”......什么是no
  • 明白。我担心像双向链表一样实现这个图会使它不像一个图,就像它必须遵循一些规则一样。抱歉,no 打错了。
  • 这个图有一个双向链表的拓扑结构。并非每个图表都是如此。

标签: c list data-structures graph


【解决方案1】:

我会像您的第二个建议一样制作一个循环双向链表。我认为这是第一个建议更容易。但前提是每个对象都有 2 个顶点。

链表是一种列表。

如果您有可变数量的顶点,您可以只拥有可变数量的指针,如下所示:

struct graph {
    int info;
    struct graph **edge;
};

然后将其分配给您需要的任何数量,例如,如果您想要一个具有 6 条边的节点,您可以这样做:

struct graph my_graph;

my_graph.edge = malloc(6 * sizeof(my_graph *));
if (my_graph.edge == NULL) {
    // allocation error
} 

您可以从这里将 6 条边连接到其他对象。

【讨论】:

  • 是的,但在这种情况下,我不明白图表和列表之间的区别在哪里。制作边向量是什么将其定义为图形?或者实现一个next和prev指针就可以了?
  • 双向链表是一个最多有 2 条边的图。如果你愿意,你可以拥有更多。只需将双指针指向struct graphmalloc() 即可指向您需要的边数。查看我的更新答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-18
  • 1970-01-01
  • 1970-01-01
  • 2017-12-17
相关资源
最近更新 更多