我一直在尝试在C中实现队列结构,使用C中链接列表的另一种实现。
我已经在linked_list.h中定义了队列所需的一些函数,我想为它们别名一个新名称;例如,为create_list()创建别名create_queue()。
因为我对C编程很新,所以我在网上查找了一种方法来实现这一点,我遇到了函数指针的主题。这似乎是做我想要的正确方式,但是当我尝试它时:
#include "linked_list.h"
typedef list_t queue_t; // list_t is the list type defined in linked_list.h,
// as well as the functions such as create_list()
queue_t (*create_queue)() = NULL; // Setting the function pointer to NULL
create_queue = &create_list; // Aliasing create_queue() for create_list()
当我尝试编译时,我收到错误并发出警告:
我的代码中缺少什么?我不想完全解决我的问题,只需要以正确的方式重定向。
这是create_list():
list_t create_list(){
/* Creates and returns a NULL list, with index and value zeroed */
list_t list;
malloc(sizeof(list_t));
list.global_index = 0; /* Global index to keep how many nodes in the list, since no loops are allowed */
list.total_value = 0; /* Total value to keep total value of nodes in the list, since no loops are allowed */
list.head = NULL;
list.last = NULL;
return list;
}
结构定义:
struct int_node {
int value;
struct int_node * previous; /* Needed to go to previous nodes with no loops */
struct int_node * next;
};
struct int_list {
int global_index;
int total_value;
struct int_node * head;
struct int_node * last;
};
/* Typedefs */
typedef struct int_node node_t;
typedef struct int_list list_t;
答案 0 :(得分:2)
尝试替换这些行:
queue_t (*create_queue)() = NULL; // Setting the function pointer to NULL
create_queue = &create_list; // Aliasing create_queue() for create_list()
这一行:
queue_t (*create_queue)() = &create_list; // Aliasing create_queue() for create_list()
我编译没有错误。
答案 1 :(得分:1)
如果链接列表中存在相同的函数,则执行此操作的正确方法是创建函数包装器。例如,如果你有
void linklist_add (int x);
并且想要创建一个queue_add函数,你可以实现它:
void queue_add (int x)
{
linklist_add(x);
};
从“linklist_t
”到“queue_t
”等的任何类型转换都可以在包装函数内部处理。
现在看完这篇文章后,至少有十个人会立即开始尖叫额外的函数调用开销。 不要担心这个!编译器可能会优化或内联函数。即使它没有,额外的函数调用开销也可以忽略99%的所有系统。
努力使代码尽可能可读,这应该始终是主要关注点。简单的解决方案通常是最佳解决方案。优化是您应该在实际需要时才考虑的事项。
函数指针有效,但它必须是一个全局变量,这很少是一个好主意。此外,函数指针往往会生成不可读的代码,尤其是当您不键入它们时。函数指针应该用于泛型编程,而不是用于调用者接口。