3.入队 void QueuePush(Queue* pq, QDataType x)//入队{assert(pq);QNode* newnode = (QNode*)malloc(sizeof(QNode)); //创建节点if (newnode == NULL){perror(malloc);exit(-1);} //将节点赋值newnode-val = x;newnode-next = NULL; //当队列为
3.入队
void QueuePush(Queue* pq, QDataType x)//入队
{
assert(pq);
QNode* newnode = (QNode*)malloc(sizeof(QNode)); //创建节点
if (newnode == NULL)
{
perror("malloc");
exit(-1);
}
//将节点赋值
newnode->val = x;
newnode->next = NULL;
//当队列为空时
if (pq->head == NULL)
{
pq->head = pq->tail = newnode;
}
//当队列不为空时
else
{
pq->tail->next = newnode;
pq->tail = newnode;
}
pq->size++;
}
入队时判断当队列为空时
pq->head = pq->tail = NULL
,不能对pq->tail
解引用。
4.出队
void QueuePop(Queue* pq)//出队列
{
assert(pq);
assert(!QueueEmpty(pq)); //判断队列是否为空
//当队列中只剩一个结点时
if (pq->head->next == NULL)
{
free(pq->head);//释放节点
pq->head = pq->tail = NULL;//队列置空
}
//队列中有多个结点时
else
{
QNode* cur = pq->head;//记录下一个节点
pq->head = cur->next;
free(cur);//释放头节点
}
pq->size--;//有效个数--
}
出队时要判断队列是否为空,
assert(!QueueEmpty(pq))
。
5.打印
void QueuePrint(Queue* pq)//打印
{
assert(pq);
QNode* cur = pq->head;
while (cur)
{
printf("%d ", cur->val);
cur = cur->next;
}
printf("\n");
}
注意循环条件
while (cur)
,不能写为while(cur!=pq->tail)
。
6.返回队头的值
QDataType QueueFront(Queue* pq)//返回队头的值
{
assert(pq);
assert(!QueueEmpty(pq));
return pq->head->val;
}
7.返回队尾的值
QDataType QueueBack(Queue* pq)//返回队尾的值
{
assert(pq);
assert(!QueueEmpty(pq));
return pq->tail->val;
}
8.统计队列中有效值个数
int QueueSize(Queue* pq)//返回队列中有效值个数
{
assert(pq);
//int size = 0;
//QNode* cur = pq->head;
//while (cur)
//{
// size++;
// cur = cur->next;
//}
//return size;
return pq->size;
}
9.销毁
void QueueDestroy(Queue* pq)//销毁
{
assert(pq);
QNode* cur = pq->head;
//遍历,一个一个的释放空间
while (cur)
{
QNode* del = cur->next;
free(cur);
cur = del;
}
pq->head = pq->tail = NULL;//置空
}