全局变量链接列表在C中排队? (初始化元素不是常数)

时间:2018-03-19 00:28:35

标签: c linked-list global-variables

我正在开发一个涉及一系列队列的项目。这些队列旨在成为全局范围,因为它们由一系列功能处理和修改。截至目前,我的实现引发了“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的情况下构建链接列表。)

2 个答案:

答案 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;
}