2014-10-09 2 views
3

У меня есть базовый дизайн очереди, но я хочу иметь несколько очередей. То, как он выглядит сейчас, это то, что мне нужен еще один файл 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]

+0

Для push-обозначения 'iceCreamLine.push (13);' для работы вам понадобится элемент 'void (* push) (int);' в структуре 'struct Node', и вам придется убедитесь, что каждый 'struct Node' инициализирован правильно, так что элемент' push' указывает на правильную функцию. –

+0

Создание новых версий файла с разными именами для 'head' и' tail' и т. Д. Было бы катастрофой. +1 за то, что вы так много подозреваете, и задаетесь вопросом, прежде чем приступать к реализации. –

ответ

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

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

+0

Я редактировал мой код выше, но я не из C фона. С чего начать голову и хвост? И как толкнуть и поп узнать, что такое голова и хвост? Спасибо – user3838436

+0

Основываясь на вашем другом коде, вы должны ввести '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; '. –

+0

Спасибо, я думаю, что у меня почти все работает. Мне нужен синтаксис, например iceCreamLine.push (13); вместо push (& iceCreamLine, 13), но это будет сделано. Я отредактировал код к тому, что вы все сказали, но получите предупреждения и дамп сегментации на моем втором printf. Я пришел к ненавистным указателям! – user3838436

Смежные вопросы