当前位置 : 主页 > 编程语言 > c语言 >

队列(二)

来源:互联网 收集:自由互联 发布时间:2023-08-28
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;//置空
}

上一篇:C语言红绿灯时间问题
下一篇:没有了
网友评论