在C中实现数据结构的一些聪明(非普通)方法是什么?应该更频繁地使用哪些数据结构?
例如,在C中实现带加权边的有向和循环图的最有效方法(产生最小开销)是什么? 我知道我们可以像here那样将距离存储在数组中,但是还有其他方法可以实现这种图形吗?
答案 0 :(得分:1)
回答你的第一个问题,我建议使用不透明指针封装你的结构(a.k.a Handles)。
例如,您可以声明链接列表的句柄(此处类似于MS的命名):
typedef struct linked_list_t* HLINKEDLIST;
我们假设linked_list_t是一个通用的(由void指针组成)。
通过这种方式,您可以隐藏链接列表的“句柄”或实现的形式(信息隐藏):
HLINKEDLIST LinkedListCreate();
LinkedListAdd(LLELEMENT v);
LinkedListCopy(HLINKEDLIST dst, const HLINKEDLIST src);
也常常定义句柄子类型,例如PHLINKEDLIST(指向链表句柄的指针)。
也可以为方便起见定义相关类型(并使用C中可用的有限信息隐藏)。例如:链表元素类型可以定义为
typedef void* LLELEMENT;
C中的数据结构有很好的书籍可以检查。这很好:http://www.amazon.com/Interfaces-Implementations-Techniques-Creating-Reusable/dp/0201498413
另请注意,LLELEMENT实际上与void *兼容,因此如果您将其他类型def定义为:
typedef void* SYSTEMDATA;
SYSTEMDATA与LLELEMENT兼容,因此编译器不会抱怨:
int QuerySystemData(SYSTEMDATA* sd);
并致电:
QuerySystemData(lle);
其中lle属于LLELEMENT类型。
可以强制执行此类型检查,将简单成员封装在结构中。如果我不记得错误,在使用windows.h的程序中声明STRICT会导致句柄更安全(两者之间不兼容)。以下定义很常见:
typedef struct __HWND
{
int __handle;
} __HWND;
typedef __HWND* HWND;
如果更简单的定义是:
typedef int HWND;
typedef int HBITMAP;
两个句柄类型兼容,并且可以与希望使用windows和函数的函数互换,期望使用位图(潜在的可怕错误)。