只是为了那种“有趣”,我正在开发几乎所有算法(如果可能的话),这些算法都在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,根据您的经验和知识,您推荐什么?
顺便说一句,我确信之前有人问过这个,因为这是我的实施。答案 0 :(得分:2)
可惜这很简单C.使用C ++,这些问题中的一些将由该语言的多态特征处理。另一方面,研究算法可以让你专注于算法/数据结构,而不是语言的一些光滑的特征。
无论如何......我的两分钱:
关于选择d或u图表类型:为什么不将属性添加到DT_Graph以通知调用图表类型的方法。毕竟,这是在创建图表时指定的。 ==>巴姆!我们只有两种方法。
关于边权重...可能有两种方法是优选的,API方式:为什么用额外的参数打扰非权重的情况。在实施方面,您当然可以在所有4个案例之间共享尽可能多的逻辑。坦率地说,一旦你写完所有这些,你仍然可以将这些方法置于一个“黄金”方法背后,就像你建议的那样。
祝你好运!