检查队列是否为空
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;
}
我是 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;
}