在C& C中实现不同数据结构的巧妙方法应该更频繁地使用的数据结构

时间:2010-05-22 05:05:55

标签: c data-structures

在C中实现数据结构的一些聪明(非普通)方法是什么?应该更频繁地使用哪些数据结构?

例如,在C中实现带加权边的有向和循环图的最有效方法(产生最小开销)是什么? 我知道我们可以像here那样将距离存储在数组中,但是还有其他方法可以实现这种图形吗?

1 个答案:

答案 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和函数的函数互换,期望使用位图(潜在的可怕错误)。