Множество опашки в C

Имам основен дизайн на опашка, но искам да имам няколко опашки. Начинът, по който изглежда в момента, е, че ще ми трябва друг файл queue.h и ще заменя главата и опашката с различни имена, но съм сигурен, че има по-добър начин?

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