У меня есть базовый дизайн очереди, но я хочу иметь несколько очередей. То, как он выглядит сейчас, это то, что мне нужен еще один файл queue.h и заменить голову и хвост на разные имена, но я уверен, что есть лучший способ?Несколько очередей в C
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.c: 6: 2: предупреждение: проходя аргумент 1 из «выталкивания» из несовместимого типа указателя [по умолчанию включено] В файле включены from queue.c: 2: 0: queue.h: 21: 6: note: expected 'struct Queue *', но аргумент имеет тип 'struct Queue **' main.c: 7: 2: warning: передающий аргумент 1 из 'push' из несовместимого типа указателя [включен по умолчанию] В файле, включенном из queue.c: 2: 0: queue.h: 21: 6: note: expected 'struct Queue *', но аргумент имеет тип ' struct Queue ** ' main.c: 9: 2: warning: format'% d 'ожидает аргумент типа' int ', но аргумент 2 имеет тип' int * '[-Wformat] main.c: 10: 2: предупреждение: формат '% d' ожидает аргумент типа 'Int', но аргумент 2 имеет тип 'INT * [-Wformat]
Для push-обозначения 'iceCreamLine.push (13);' для работы вам понадобится элемент 'void (* push) (int);' в структуре 'struct Node', и вам придется убедитесь, что каждый 'struct Node' инициализирован правильно, так что элемент' push' указывает на правильную функцию. –
Создание новых версий файла с разными именами для 'head' и' tail' и т. Д. Было бы катастрофой. +1 за то, что вы так много подозреваете, и задаетесь вопросом, прежде чем приступать к реализации. –