Несколько очередей в C

У меня простой дизайн очереди, но я хочу иметь несколько очередей. Прямо сейчас это выглядит так: мне понадобится еще один файл queue.h и заменить head и tail другими именами, но я уверен, что есть способ лучше?

queue.h * Отредактировано

#include<stdlib.h>  // malloc

struct Node {
    int data;
    struct Node* next;
};

struct Queue {
  struct Node *head, *tail;
};

struct Queue *QueueInit() {
    //allocate and initialize a queue
    struct Queue *thisQueue = malloc(sizeof *thisQueue);
    thisQueue->head = NULL;
    thisQueue->tail = NULL;
    return thisQueue;
}


void push(struct Queue *myQueue, int x) {
    struct Node *temp; 
    temp = malloc(sizeof(struct Node));
    temp->data = x;
    temp->next = NULL;  
    if(myQueue->head == NULL && myQueue->tail == NULL) { //empty
        myQueue->head = myQueue->tail = temp;
        return;
    }
    myQueue->tail->next = temp;
    myQueue->tail = temp;
}

void pop(struct Queue *myQueue) {
    struct Node* temp = myQueue->head;
    if(myQueue->head == NULL) return;   //empty
    if(myQueue->head == myQueue->tail) {
        myQueue->head = myQueue->tail = NULL;
    }
    else {
        myQueue->head = myQueue->head->next;
    }
    free(temp);
}

Как я могу создать несколько таких очередей?

main.c

int main() {
    struct Node iceCreamLine;
    struct Node bathroomLine;

    iceCreamLine.push(13);
    bathroomLine.push(2);


    //It looks like I will have to use this syntax then instead?
    struct Queue *droneQueue;    //(THIS IS LINE 5)
    push(&droneQueue,1666);
    push(&droneQueue,100);

    printf("--> %d",&droneQueue->head->data);
    printf("--> %d",&droneQueue->head->next->data);

}

Первый printf работает, но второй дает мне дамп сегментации. Также вот предупреждения

main.c: В функции 'main': main.c: 6: 2: предупреждение: передача аргумента 1 'push' из несовместимого типа указателя [включено по умолчанию] В файле, включенном из queue.c: 2: 0: очередь. h: 21: 6: примечание: ожидается 'struct Queue *', но аргумент имеет тип 'struct Queue **' main.c: 7: 2: предупреждение: передача аргумента 1 'push' из несовместимого типа указателя [включено по умолчанию ] В файле, включенном из queue.c: 2: 0: queue.h: 21: 6: примечание: ожидается 'struct Queue *', но аргумент имеет тип 'struct Queue **' main.c: 9: 2: предупреждение: формат '% d' ожидает аргумент типа 'int', но аргумент 2 имеет тип 'int *' [-Wformat] main.c: 10: 2: предупреждение: формат '% d' ожидает аргумент типа 'int', но аргумент 2 имеет тип int * [-Wformat]


person user3838436    schedule 09.10.2014    source источник
comment
Чтобы нотация push iceCreamLine.push(13); работала, вам понадобится элемент void (*push)(int); в структуре struct Node, и вам нужно будет убедиться, что каждый struct Node инициализирован должным образом, чтобы элемент push указывал на правильную функцию.   -  person Jonathan Leffler    schedule 09.10.2014
comment
Создание новых версий файла с разными именами для head, tail и т. Д. Было бы катастрофой. +1 за то, что так много подозревала и беспокоилась о том, чтобы спросить, прежде чем реализовывать.   -  person Jonathan Leffler    schedule 09.10.2014


Ответы (1)


struct Queue {
  struct Node *head, *tail;
};

Добавьте функцию QueueInit для выделения и инициализации очереди, возвращая указатель на struct Queue. Передайте указатель на struct Queue на push и pop и избавьтесь от ваших глобальных head и tail.

person Politank-Z    schedule 09.10.2014
comment
Я отредактировал свой код выше, но я не из C. Куда будут инициализированы голова и хвост? И как толкать и хлопать знать, что такое голова и хвост? Спасибо - person user3838436; 09.10.2014
comment
Основываясь на другом вашем коде, вы должны инициализировать head и tail в NULL. Вы должны добавить struct Queue * в список параметров для push и pop - void push(struct Queue *myQueue, int x) и void pop(struct Queue *myQueue). Внутри push и pop вы должны ссылаться на myQueue->head и myQueue->tail. Кроме того, ваш QueueInit должен иметь return thisQueue;. - person Politank-Z; 09.10.2014
comment
Спасибо, я думаю, у меня почти все заработало. Мне нужен синтаксис вроде iceCreamLine.push (13); вместо push (& iceCreamLine, 13), но этого достаточно. Я отредактировал код в соответствии с тем, что вы все сказали, но получаю предупреждения и дамп сегментации на моем втором printf. Я возненавидел указатели! - person user3838436; 10.10.2014
comment
Поскольку вы объявляете droneQueue как указатель, вы не должны отправлять его в push с &. &droneQueue означает указатель на droneQueue, как вы его закодировали, указатель на указатель. Избавление от всех ваших & должно помочь. Также не забудьте инициализировать droneQueue, присвоив ему возвращаемое значение QueueInit. - person Politank-Z; 10.10.2014