如何在c或c ++中创建异构链接列表
一个可以保存浮点数,整数,字符等数据和算法的链接列表应该很好而且不是很复杂
我想到了创建一个带有void指针的结构,它将指向后续节点。 但问题是我不能使用带结构的模板。
下到c,我必须测试用户输入的每个字符,以测试它是否是整数,浮点数或字符。然后我们可以进一步
请建议一个有效的算法/代码
如果你想自己做这件事,你基本上想要创建一个数组或链接的元素列表,它们既编码数据又编码数据类型。 您可以使用包含类型指示符和要处理的各种类型的并集的结构,并创建该结构的数组或链接列表:
typedef struct { int type_indicator; union { float f; int i; double d; void *p; char c; } } generic_item; generic_item generic_array[10];
我将留给你为类型指示器提供一个适当的枚举,并为你的算法添加一个函数指针。 如果你想要一个链表而不是一个数组,你显然还需要添加一个generic_item *next
指针。
我没有查看其他答案链接到的提升选项,但我可能会在尝试推出自己的解决方案之前先查看一下。
使用boost :: variant或boost :: any 。 取决于您的需求。
注意:这是纯粹的C答案。
我将从这个数据结构开始:
typedef struct heterogeneous_list { enum { CHAR, STRING, FLOAT, INT } type; void *item; struct heterogeneous_list *next; }
当我从用户那里获得该项目时,我会将其存储在列表中(假设当前点位于列表的末尾):
current->next = malloc(sizeof(heterogeneous_list)); case (/* whether the user entered a char, string, float, or int */ { case /* char */: current->next.item = malloc(sizeof(char)); current->next.type = CHAR; current->next.next = NULL; break; /* and so forth, for string, int, and float */ } current = current->next;
在遍历列表时,现在可以很容易地根据类型处理列表中的内容。 以下代码假定current
是迭代中查看的列表中的当前项(循环遍历列表):
char currentItemChar; char * currentItemString; float currentItemFloat; int currentItemInt; case (current->type) { case CHAR: currentItemChar = *((char*) current->item); // process a character break; case STRING: currentItemString = (char*) current->item; // process a string break; case FLOAT: currentItemFloat = *((float*) current->item); // process a float break; . . . };
这就是我要做的。
http://www.boost.org/doc/libs/1_48_0/doc/html/variant.html
(当然,在解释推动变体给你的东西之前,还提到了C / C ++联盟)
可以使用void *
作为指向数据项的指针来创建异构链表:
struct Node { Node * previous; Node * next; void * p_data; };
在实现异构容器之前,可能会询问是否可以将设计更改为使用homegeneous容器。
你可以使用 – 正如你所提到的那样 – 使用一些或多或少棘手的宏来做一些虚拟指针。
您可以定义包含三个指针的结构(或类):next,prev(对于下一个和上一个list元素),以及某种void* data
。 您还可以存储每个列表条目的类型(可以通过enum
或类似的东西来实现)。
此外,您可以定义一个宏 – 给定一个列表项 – 检索数据并自动将其转换为给定类型:
#define get_list_item(item, type) *(type*)(((item)->data))