队列——数据结构——day5

队列

队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。
队列是一种先进先出(First In First Out)的线性表,简称FIFO。允许插入的一端称为队尾,允许删除的一端称为队头。假设队列是q=(a1,a2,……,an),那么a1就是队头元素,而an是队尾元素。这样我们就可以删除时,总是从a1开始,而插入时,列在最后。这也比较符合我们通常生活中的习惯,排在第一个的优先出列,最后来的当然排在队伍最后。

在这里插入图片描述

队列的抽象数据类型

初始化操作

初始化操作,建立一个空队列

QUEUE_LIST *CreatQueueList()
{
	QUEUE_LIST *p = malloc(sizeof(QUEUE_LIST));
	if(NULL == p)
	{
		perror("fail to malloc");
		return NULL;
	}

	p->pfront = NULL;
	p->preal = NULL;
	p->clen = 0;

	return p;
}

清空

将队列Q清空

int ClearQueue(QUEUE_LIST *plist)
{
	while(!IsEmptyOfQueue(plist))
	{
		PopHeadQueue(plist,NULL);
	}
	
	return 0;
}

销毁

若队列存在,则销毁

void DestroyQueue(QUEUE_LIST *plist)
{
	ClearQueue(plist);
	free(plist);
}

创建节点元素

创建节点元素,为插入做准备

QUEUE_NODE *CreatQueueNode(DATA_TYPE num)
{
	QUEUE_NODE *p = malloc(sizeof(QUEUE_NODE));
	if(NULL == p)
	{
		perror("fail to malloc");
		return NULL;
	}

	p->pnext = NULL;
	p->data = num;

	return p;
}

查看队列是否为空

若队列Q为空,返回0

int IsEmptyOfQueue(QUEUE_LIST *plist)
{
	return NULL == plist->pfront;
}

插入

若队列存在,插入新元素pnode到队列中并成为队尾元素。

int PushTailQueue(QUEUE_LIST *plist,QUEUE_NODE *pnode)
{
	if(IsEmptyOfQueue(plist))
	{
		plist->pfront = pnode;
		plist->preal = pnode;
		plist->clen++;
	}else
	{
		plist->preal->pnext = pnode;
		plist->preal = pnode;
		plist->clen++;
	}

	return 0;
}

删除

删除队列Q中队头元素,并用num返回其值

int PopHeadQueue(QUEUE_LIST *plist,DATA_TYPE *num)
{
	if(IsEmptyOfQueue(plist))
	{
		return -1;
	}
	
	QUEUE_NODE *p = plist->pfront;
	plist->pfront = p->pnext;

	if(plist->pfront == NULL)
	{
		plist->preal = NULL;
	}
	if(num != NULL)
	{
		*num = p->data;
	}
	free(p);
	plist->clen--;

	return 0;
}

队列长度

返回队列的元素个数

int QueueLength(QUEUE_LIST *plist)
{
	return plist->clen;
}

遍历

遍历队列中各个元素,并将其输出在终端

void ErgodicOfQueue(QUEUE_LIST *plist)
{
	QUEUE_NODE *p = plist->pfront;

	while(p)
	{
		printf("%d ",p->data);
		p = p->pnext;
	}

	putchar('\n');
}

以上就是今天的内容!

  • 11
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值