首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在c或c++中创建异构链接表

如何在c或c++中创建异构链接表
EN

Stack Overflow用户
提问于 2011-12-08 02:45:57
回答 6查看 14.3K关注 0票数 4

可以保存浮点、整数、字符等数据和算法的链接表应该很好,并且不是很复杂

我想创建一个具有空指针的结构,该结构将指向后续节点。但问题是我不能使用有结构的模板。

至于c,我必须测试用户输入的每个字符,以测试它是整型、浮点型、字符还是not.then,我们可以继续下去。

请建议一个有效的算法/代码

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-12-08 03:01:10

如果您想自己这样做,那么您基本上需要创建一个元素的数组或链接表,对数据和数据类型进行编码。您可以使用包含类型指示符和要处理的各种类型的联合的结构,并创建该结构的数组或链表:

代码语言:javascript
复制
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选项,但在尝试推出自己的解决方案之前,我可能会先看一看。

票数 7
EN

Stack Overflow用户

发布于 2011-12-08 02:47:55

注意:这是一个纯C语言的答案。

这个数据结构就是我一开始要做的:

代码语言:javascript
复制
typedef struct heterogeneous_list
{
    enum { CHAR, STRING, FLOAT, INT } type;
    void *item;
    struct heterogeneous_list *next;
}

当我从用户那里获得项目时,我会将其存储在列表中(假设当前指向列表的末尾):

代码语言:javascript
复制
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是迭代(遍历列表的for循环)中正在查看的列表中的当前项:

代码语言:javascript
复制
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;
    .
    .
    .
};

这就是我会做的。

票数 5
EN

Stack Overflow用户

发布于 2011-12-08 02:55:22

使用boost::variantboost::any。这取决于你的需要。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8420744

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档