gpt4 book ai didi

c - C 中具有运行时数据类型的通用队列

转载 作者:太空宇宙 更新时间:2023-11-04 04:35:13 25 4
gpt4 key购买 nike

我想创建一个链表,它可以在运行时接受任何数据类型并显示该列表。问题是不同数据类型的显示功能和内存管理发生了变化。所以我不知道该怎么做。代码示例将不胜感激。

编辑:缩小问题范围。这是队列结构(使用链表)

struct node         
{
void *data;
struct node *link;
};

struct queue
{
struct node *front;
struct node *rear;
};

现在添加新元素和显示的调用函数如下:

int main()
{
struct queue* q;
void *a;
char ch;
printf("do you want to add an element?(y/n)\n");
scanf("%c",&ch);
while(ch!=n)
{
printf("Enter the element\n");
scanf("%p",a);
enqueue(q,a);
display(q);
}
return 0;
}

以下是我的入队函数定义:

void enqueue(struct queue* queue,void* item)
{
if(queue->logical_length==queue->cnt_max)
{
printf("Queue is full\n");
return;
}
else
{
struct node*temp;
temp=(struct node*)malloc(sizeof(struct node));
temp->data=malloc(queue->data_size);
temp->link=NULL;
memcpy(temp->data,item,queue->data_size);
if(queue->front==NULL)
{
queue->rear=queue->front=temp;
queue->logical_length=queue->logical_length+1;
return;
}
queue->rear->link=temp;
queue->rear=temp;
queue->logical_length=queue->logical_length+1;
}
}

这里的问题是,如果连数据类型都不知道,如何给数据字段分配内存。因此,如果有某种方法可以找到运行时输入值的数据类型,那就更好了。

以下是我的显示功能:

void display(struct queue* queue)
{
struct node* temp;
if(queue->front==NULL)
{
printf("Queue is empty\n");
return;
}
else
{
temp=queue->front;
while(temp->link!=NULL)
{
printf("%p \t",*(void *)temp->data);
temp=temp->link;
}
printf("%p \t",*(void *)temp->data);
}
}

这里的输出总是一些随机数。

最佳答案

您可以通过两种方式中的任何一种来存储数据。

  1. 调用insert的函数将存储的控制权移交给队列; extract 函数将控制权返回给调用代码。这意味着队列不需要知道指向了多少数据。
  2. 您告诉 insert 函数数据 block 有多大以及存储位置 (void enqueue(struct queue *queue, void *item, size_t length))。但是,这意味着您只能使用可以安全复制(使用 memmove() 或等效方法)的数据结构。许多结构不能像这样复制(想想包含指针的结构)。

对于第一种机制,display() 函数被更改为一个 apply() 函数,它被赋予一个函数指针:

void apply(struct queue *queue, void *data, void (*function)(const void *item, void *data));

遍历queue,并使用队列中的当前项加上传递给apply 函数的数据调用该函数。此数据是指向使函数正常工作所需的任何上下文的指针。为了显示,它可能是一个FILE *,也可能是一个更复杂的结构。无论哪种方式,函数(由函数指针 function 指向)都知道如何处理数据,因为它与数据类型相协调。

关于c - C 中具有运行时数据类型的通用队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31170016/

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