如何解决是否可以构建一个足够通用的队列来允许它存储任何数据类型作为对象?
本质上,我试图实现的是一个通用的 enqueue( Queue *queue,void *key )
函数。我希望这个队列存储任何数据类型。这就是我构建队列的方式:
typedef struct Node {
void *key;
struct Node *next;
}Node;
typedef struct Queue {
Node *front;
Node *back;
}Queue;
Queue* initializeQueue() {
Queue *queue = (Queue*) malloc(sizeof(Queue));
queue->front = NULL;
queue->back = NULL;
return queue;
}
void enqueue( Queue *queue,void *key ) {
Node *tempRef = (Node*) malloc(sizeof(Node)); // Inserted Node will be in the back of Queue
tempRef->key = key;
tempRef->next = NULL;
if ( queue->front == NULL && queue->back == NULL ){ // When the Queue is empty
queue->front = tempRef;
queue->back = tempRef;
}
else { // When the Queue is non-empty
queue->back->next = tempRef;
queue->back = tempRef;
}
}
但事实是,这个实现是错误的,因为我将参数 void 指针存储为一个对象,它指向的地址依赖于外部数据类型(例如,像 char),这不是故意的。例如,以下代码会将地址 &key 链接到队列中的一个对象:
char key = '-';
enqueue(queue,&key );
所以理想情况下,我想在队列中存储不是地址的对象。但是,如何将任意数据类型作为对象存储在 Node 结构中?显然,使用 void*
不是解决方案,正如我上面所说的那样,那么是否有可能找到解决我的问题的方法?
提前致谢
解决方法
是否可以构建一个足够通用的队列,允许它以对象的形式存储任何数据类型?
是的。
考虑fwrite()
如何知道如何写入任何对象的内容:
通过接收对象的地址和它的大小。
Node
需要保存对象副本的地址及其大小。
typedef struct Node {
struct Node *next;
// void *key;
void *data;
size_t size;
} Node;
enqueue()
需要扩展...
// void enqueue( Queue *queue,void *key )
void enqueue(Queue *queue,const void *data,size_t size)
// Address of the object --------------^^^^
// Size of the object ------------------------------^^^^
...然后为副本分配空间,然后再复制。
Node *tempRef = malloc(sizeof *tempRef);
tempRef->data = malloc(size);
if (tempRef->data == NULL) {
free(tempRef);
return true; // fail
}
memcpy(tempRef->data,data,size);
tempRef->size = size;
tempRef->next = NULL;
...
return false; // success
如果对象中有指针......
只复制指针,而不复制它们指向的数据。
然而此时类型丢失了
存储了数据,但是类型丢失了。
出队时,所有可用的是入队数据的地址和大小,而不是其类型。
出队可以假设类型 - 如果此代码具有一组类型的包装函数,这就足够了......
... 或 ....
还通过某种枚举保存类型(来自一组有限类型)。研究_Generic
。
如果类型在整个队列中相同或每个节点可能不同,则会出现代码简化/复杂性。
祝你好运。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。