代码之家  ›  专栏  ›  技术社区  ›  chrislamprey

C中的全局变量链表队列?(初始值设定项元素不是常量)

  •  0
  • chrislamprey  · 技术社区  · 7 年前

    我正在从事一个涉及一系列队列的项目。这些队列的作用域是全局的,因为它们是由一系列函数处理和修改的。到目前为止,我的实现引发了“Initializer元素不是常量”标志。我理解为什么,但我想知道是否有其他方法来实现这一点。(即,包含每个队列的数组?)这可能吗?

    主要的c

    LIST* queue0 = ListCreate();  //0
    LIST* queue1 = ListCreate();   //1
    LIST* queue2 = ListCreate();   //2
    
    int main(){......}
    

    ListCreate如下所示:

    使生效c

    LIST *ListCreate()
    {
        int popped = popList();
        if (popped != -1){
            //Create list
            lists[popped].currSize = 0;
            return &lists[popped];
        }
        else{
            return NULL;
        }
    }
    

    (请记住,我被要求在不使用malloc的情况下构建一个链表。)

    2 回复  |  直到 7 年前
        1
  •  2
  •   davernator    7 年前
    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)
    
    }
    
        2
  •  0
  •   joop    7 年前

    实际上,您不需要动态分配链表。您可以将它们放在全局(或静态)内存中,但必须手动初始化它们,这对于小列表是可行的(注意:初始化器值都是常量,或者至少在编译时是可计算的)。示例:


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