队列
队列(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');
}
以上就是今天的内容!