代码之家  ›  专栏  ›  技术社区  ›  Community wiki

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

  •  3
  • Community wiki  · 技术社区  · 1 年前

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

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

    1 回复  |  直到 14 年前
        1
  •  1
  •   Hernán    14 年前

    在回答您的第一个问题时,我建议使用不透明指针(也称为句柄)封装您的结构。

    例如,您可以声明一个链表的句柄(此处为类似MS的命名):

    typedef struct linked_list_t* HLINKEDLIST;
    

    我们假设linked_list_t是一个通用的(由空指针组成)。

    通过这种方式,您可以隐藏链接列表的“句柄”是什么,或者以什么形式实现(信息隐藏):

    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的函数和期望使用位图的函数上是类型兼容和可互换的(潜在的可怕错误)。