图形实现,功能和参数。什么更有意义?

时间:2009-09-09 04:31:28

标签: algorithm data-structures graph

只是为了那种“有趣”,我正在开发几乎所有算法(如果可能的话),这些算法都在C语言的简介(Cormen)中展示。我已经达到了图表的章节,我不知道如何设计我的功能,但首先看看我的数据结构(希望这将清楚我的问题)。

typedef struct s_multi_matrix
    {
        int                 width;
        int                 height;
        int                 depth;
        multi_matrix_type   type;   // stores either MMTYPE_INT or MMTYPE_RECORD enums to know where to read values (ivals or rvals)
        int *               ivals;
        DT_record *         rvals;
    } DT_multi_matrix;

typedef struct s_double_linked_list
    {
        DT_record   *   sentinel;
    } DT_double_linked_list;

typedef struct s_record // multi purpose structure
    {
        int key;
        enum e_record_type  type; // stores either TYPE_INT, TYPE_SZ, TYPE_FLOAT, TYPE_VOID to know how to use the data union
        union
        {
            int     ival;
            char *  sval;
            float   fval;
            void *  vval;
        } data;
        struct s_record * left, // for trees, disjoint sets and linked lists
                        * right,
                        * parent;
    } DT_record;


typedef struct s_graph  // this is the structure I'm focusing on right now
    {
        graph_type              type;       // GRAPH_DIRECTED or GRAPH_UNDIRECTED
        graph_adj_type          adj_type;   // ADJ_LIST or ADJ_MATRIX
        edge_type           etype;  // WEIGHTED or NOT_WEIGHTED
        union
        {
            DT_double_linked_list *     list;
            DT_multi_matrix *           matrix;
        } adjacency;
    } DT_graph;

所以,我正在考虑几个操作DT_graph类型的函数:

// takes a pointer to a pointer to a graph, allocates memory and sets properties
void build_graph(DT_graph ** graph_ptr, graph_type gtype, graph_adj_type atype);
// prints the graph in file (using graphviz)
void print_graph(DT_graph * graph, char * graph_name);

这是一个棘手的部分,因为我的图形类型有几种不同的类型组合(无向和加权边,有向和加权边,无向边和非加权边,有向和没有权重边......)我想知道哪个是这些功能的最佳方法:

void dgraph_add_wedge(DT_graph * graph, DT_record * u, DT_record * v, int weight);
void ugraph_add_wedge(DT_graph * graph, DT_record * u, DT_record * v, int weight);
void dgraph_add_nwedge(DT_graph * graph, DT_record * u, DT_record * v);
void ugraph_add_nwedge(DT_graph * graph, DT_record * u, DT_record * v);

前两个会将加权顶点添加到有向/无向图中,最后两个会做同样的事情但没有任何与边相关的权重。 我想到的另一种方法是这样的:

void graph_add_edge(DT_graph * graph, DT_record * u, DT_record * v, edge_type etype, graph_type gtype);

对于所有内容来说,这似乎是一种“黄金”方法,并且取决于etype和gtype的值,会对图形执行不同的操作。

Soooooooo,根据您的经验和知识,您推荐什么?

顺便说一句,我确信之前有人问过这个,因为这是我的实施。

1 个答案:

答案 0 :(得分:2)

可惜这很简单C.使用C ++,这些问题中的一些将由该语言的多态特征处理。另一方面,研究算法可以让你专注于算法/数据结构,而不是语言的一些光滑的特征。

无论如何......我的两分钱:

关于选择d或u图表类型:为什么不将属性添加到DT_Graph以通知调用图表类型的方法。毕竟,这是在创建图表时指定的。 ==>巴姆!我们只有两种方法。

关于边权重...可能有两种方法是优选的,API方式:为什么用额外的参数打扰非权重的情况。在实施方面,您当然可以在所有4个案例之间共享尽可能多的逻辑。坦率地说,一旦你写完所有这些,你仍然可以将这些方法置于一个“黄金”方法背后,就像你建议的那样。

祝你好运!