我正在开发一个涉及一系列队列的项目。这些队列旨在成为全局范围,因为它们由一系列功能处理和修改。截至目前,我的实现引发了“Initializer element is not constant”标志。我理解为什么,在大多数情况下,但我想知道是否有另一种方法来实现这一目标。 (即包含每个队列的数组?)这可能吗?
的main.c
LIST* queue0 = ListCreate(); //0
LIST* queue1 = ListCreate(); //1
LIST* queue2 = ListCreate(); //2
int main(){......}
ListCreate发生如下:
implement.c
LIST *ListCreate()
{
int popped = popList();
if (popped != -1){
//Create list
lists[popped].currSize = 0;
return &lists[popped];
}
else{
return NULL;
}
}
(请记住,我需要在不使用malloc的情况下构建链接列表。)
答案 0 :(得分:2)
LIST* queue0 = NULL;
LIST* queue1 = NULL;
LIST* queue2 = NULL;
void initQueues(void) {
queue0 = ListCreate();
queue1 = ListCreate();
queue2 = ListCreate();
}
void main(int argc, char *argv[]) {
initQueues();
// ... (i.e. other stuff)
}
答案 1 :(得分:0)
您实际上并不需要动态分配链接列表。您可以将它们放在全局(或静态)内存中,但是您必须手动初始化它们,这对于小列表是可行的(注意:初始化值都是常量,或者至少在编译时可计算)。例如:
struct llist {
struct llist *next;
// Whatever
char *payload;
};
struct llist lists[] =
{{ lists+1, "one" }
,{ lists+2, "two" }
,{ lists+3, "three" }
,{ lists+4, "four" }
,{ lists+5, "five" }
,{ lists+6, "six" }
,{ lists+7, "seven" }
,{ lists+8, "eight" }
,{ lists+9, "nine" }
,{ NULL, "ten" }
};
struct llist *freelist = lists;
struct llist *queue = NULL;
/* example for constructor / destructor */
struct llist *newnode (void)
{
struct llist *this ;
this = freelist;
if (this) freelist = this->next;
return this;
}
void freenode (struct llist *ptr)
{
if (!ptr) return;
ptr->next = freelist;
freelist= ptr;
}