У меня простой дизайн очереди, но я хочу иметь несколько очередей. Прямо сейчас это выглядит так: мне понадобится еще один файл 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]
iceCreamLine.push(13);
работала, вам понадобится элементvoid (*push)(int);
в структуреstruct Node
, и вам нужно будет убедиться, что каждыйstruct Node
инициализирован должным образом, чтобы элементpush
указывал на правильную функцию. - person Jonathan Leffler   schedule 09.10.2014head
,tail
и т. Д. Было бы катастрофой. +1 за то, что так много подозревала и беспокоилась о том, чтобы спросить, прежде чем реализовывать. - person Jonathan Leffler   schedule 09.10.2014