gpt4 book ai didi

c++ - 使用 Void* 指针的链表

转载 作者:行者123 更新时间:2023-11-30 01:21:53 25 4
gpt4 key购买 nike

我想在 C/C++ 中创建一个通用链表(不使用 C++ 模板)。我编写了以下简单程序,目前运行良好 -

typedef struct node
{
void *data;
node *next;
}node;


int main()
{
node *head = new node();

int *intdata = new int();
double *doubledata = new double();

char *str = "a";
*doubledata = 44.55;
*intdata = 10;

head->data = intdata;

node *node2 = new node();
node2->data = doubledata;
head->next = node2;

node *node3 = new node();
node3->data = str;
node3->next = NULL;
node2->next = node3;

node *temp = head;
if(temp != NULL)
{
cout<<*(int *)(temp->data)<<"\t";
temp = temp->next;
}
if(temp != NULL)
{
cout<<*(double *)(temp->data)<<"\t";
temp = temp->next;
}
if(temp != NULL)
{
cout<<*(char *)(temp->data)<<"\t";
temp = temp->next;
}
return 0;
}

我的问题是——我需要知道我在上面的代码中打印的数据的数据类型。例如 - 第一个节点是 int 所以我写了 -*(int *)(温度->数据)第二个是双等......相反,是否有任何通用的方法可以简单地显示数据而不用担心数据类型?

我知道您可以使用模板实现此目的,但如果我必须仅在 C 中执行此操作怎么办?

谢谢,基达

最佳答案

通用列表的全部意义在于您可以在其中存储任何内容。但是你必须现实一点……你仍然需要知道你在里面放了什么。。因此,如果您打算将混合类型放入列表中,那么您应该考虑使用 Variant 模式。即一个类型提供多种类型。这是一个简单的变体:

typedef struct Variant
{
enum VariantType
{
t_string,
t_int,
t_double
} type;

union VariantData
{
char* strVal;
int intVal;
double doubleVal;
} data;

} Variant;

然后你可以告诉自己“我正在我的 void* 列表中存储指向变体的指针。这就是你在 C 中的做法。我假设当你说“C/C++”时你意味着您正在尝试编写 C 代码但正在使用 C++ 编译器。不要忘记 C 和 C++ 是两种不同的语言,它们有一些重叠。尽量不要将它们放在一个词中,就好像它们是一种语言一样.

关于c++ - 使用 Void* 指针的链表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17459190/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com