检查队列是否为空

Checking if queue is empty

我是 C 的新手,我正在尝试编写队列问题的代码。目前,我正在编写一些代码来检查队列是否为空。这是我目前所拥有的:

对于Queue.h(这是我们的导师提供的)

#include <stdio.h>
#include <stdlib.h>

struct queueNode {
    char data;
    struct queueNode *nextPtr;
};

typedef struct queueNode QueueNode;
typedef QueueNode* QueueNodePtr;

typedef struct Queue {
    QueueNodePtr head;
    QueueNodePtr tail;
} Queue;

void instructions();
int isEmpty(Queue);
void enqueue(Queue*, char);
char dequeue(Queue*);
void printQueue(Queue);
void freeQueue(Queue*);

对于Queue.c

#include <stdio.h>
#include <stdlib.h>

#include "Queue.h"

int isEmpty(struct Queue queue)
 {
     if (Queue == NULL)
     {
         return 1;
     }
 }

问题出在 Queue.c 的第 8 行,编译器显示“错误:'Queue' 之前的预期表达式”,我将如何解决这个问题?

编辑:我尝试使用 queue == NULL 而不是 Queue == NULL 并且编译器说:错误:操作数无效二进制==(有'struct Queue'和'void*')。

非常感谢!

首先,使用一致的方式传递队列。注意接口的区别:

int isEmpty(Queue);             //<-- by value
void enqueue(Queue*, char);     //<-- by reference
char dequeue(Queue*);           //<-- by reference
void printQueue(Queue);         //<-- by value
void freeQueue(Queue*);         //<-- by reference

其中一些是按值传递队列结构,而另一些是按引用(指针)传递。您可能希望所有函数都对指针进行操作, Queue*.

接下来,您应该进行某种初始化队列的操作。您已经有 freeQueue,这正好相反。所以你可能想要 initQueue:

void initQueue(Queue* q) {
    q->head = NULL;
    q->tail = NULL;
}

现在,进入实际问题...正如我已经建议的那样,您应该更改 isEmpty(和 printQueue)以接受 指针 到队列。然后你使用任何逻辑应该表明队列是空的。由于我在上面断言了初始化时,head 指针可能应该为 NULL,那么这也是一个合适的“空”测试:

int isEmpty(Queue* q) {
    return q->head == NULL;
}

最后,由于您可能会问如何实际使用它:

int main(void)
{
    Queue q;

    initQueue(&q);
    printf("Queue empty: %d\n", isEmpty(&q));

    enqueue(&q, 'X');
    printf("Queue empty: %d\n", isEmpty(&q));

    enqueue(&q, 'Y');
    enqueue(&q, 'Z');
    printQueue(&q);

    printf("Removed %c\n", dequeue(&q));
    printQueue(&q);

    freeQueue(&q);        
    return 0;
}