![]() |
1
4
我将给您举一个例子,说明如何在C中实现泛型功能。这个例子在一个链接列表中,但我确信您可以在必要时在AVL树中对其进行调整。 首先,您需要为list元素定义一个结构。可能的(最简单的实现):
其中“data”将充当“container”,用于保存信息,“next”是对直接链接元素的引用。(注意:二进制树元素应该包含对右/左子元素的引用)。 创建元素结构后,需要创建列表结构。一个好的实践是让一些指向函数的成员:析构函数(需要释放“data”保存的内存)和比较器(能够比较两个列表元素)。 列表结构实现可能如下所示:
在设计数据结构之后,应该设计数据结构接口。假设我们的列表将具有以下最简单的界面:
在哪里?
现在功能实现:
现在,如何使用简单的通用链表实现。在下面的示例中,列表的作用类似于堆栈:
请注意,您可以使用引用更复杂结构的指针,而不是“int*j”。如果这样做,请不要忘记相应地修改“list->析构函数”。 |
![]() |
2
3
亚历克斯说的。在C中,
假设你必须在C工作,尽管…为什么需要向库提供创建/复制/分配/销毁功能?这个库的哪些特性需要AVL树代码来使用这些操作? 搜索树上的主要操作是插入、删除和查找,对吗?您需要为所有这些操作提供一个比较函数,但是您应该让这个库的客户机处理所有其他操作。在这种情况下,简单可能更好。 |
![]() |
3
1
要做到这一点,在C语言中执行泛型,需要使用预处理器进行黑客攻击。这种方法有许多与C++模板方法相同的缺点,即所有(大多数,无论如何)代码必须位于头文件中,调试和测试是一种痛苦。它的优点还包括:您可以获得优异的性能,让编译器进行各种内联以加快速度,通过减少间接寻址来最小化分配,以及一点类型安全性。 定义如下(假设我们有一个哈希集)
然后要使用它,只需使用上面创建的类型:
在内部,这是通过一系列令牌粘贴等实现的,并且(如上所述)是一个巨大的测试难题。 比如:
您甚至可以添加选项,例如定义哈希集值类型或定义哈希集调试。 |
![]() |
MaPo · Linux,设置锁定ICMP_过滤器选项 4 月前 |
![]() |
Doohyeon Won · 内联函数上的奇怪现象?[关闭] 5 月前 |
![]() |
Bobby · 复合字面值总是左值吗? 5 月前 |
![]() |
9-Pin · C: 嵌套结构的堆栈内存分配 5 月前 |