Имам основен дизайн на опашка, но искам да имам няколко опашки. Начинът, по който изглежда в момента, е, че ще ми трябва друг файл 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]
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