赞
踩
勤时当勉励 岁月不待人
C/C++ 游戏开发
Hello,米娜桑们,这里是君兮_,我们继续来学习初阶数据结构的内容,今天我们要讲的是栈与队列内容中队列部分的内容
好了,废话不多说,开始今天的学习吧!—
typedef int QDataType;
typedef struct QueueNode
{
struct QueueNode* next;
QDataType data;
}QNode;
typedef struct Queue
{
QNode* head;
QNode* tail;
int size;
}Que;
//初始化队列
void QueueInit(Que* pq)
{
assert(pq);
pq->head = pq->tail = NULL;
pq->size = 0;
}
//把结点插入队列中(尾插) void QueuePush(Que* pq, QDataType x) { assert(pq); QNode* newnode = (QNode*)malloc(sizeof(QNode));//malloc申请空间 if (newnode == NULL)//判断申请是否成功 { perror("malloc failed\n"); exit(-1); } newnode->data = x;//插入元素 newnode->next = NULL; if (pq->tail == NULL) { pq->head = pq->tail = newnode;//如果此时队列中没有元素就把头和尾都指向开辟出来的空间 } else { //尾插 pq->tail->next = newnode; pq->tail = newnode; } pq->size++;//插入元素成功,有效元素个数加1 }
// 删除队列中某个结点 void QueuePop(Que* pq) { assert(pq); assert(!QueueEmpty(pq));//判空,如果为空就不需要再删除了 //如果只有一个结点 if (pq->head->next == NULL) { //只有一个结点,释放该节点将头尾置空 free(pq->head); pq->head = pq->tail = NULL; } else { //出队列 QNode* next = pq->head->next;//保存一下此时要删除结点的下一个结点 free(pq->head);//释放掉该结点 pq->head = next;//头指向删除结点的下一个结点 } pq->size--;//队列中有效元素减1 }
//判断队列是否为空
bool QueueEmpty(Que* pq)
{
assert(pq);
return pq->tail == NULL;
}
//获取队列的队头元素
QDataType QueueFront(Que* pq)
{
assert(pq);
assert(!QueueEmpty(pq));
QNode* cur = pq->head;
return cur->data;
}
//获取队列的队尾元素
QDataType QueueBack(Que* pq)
{
assert(pq);
assert(!QueueEmpty(pq));
return pq->tail->data;
}
//队列的销毁
void QueueDestroy(Que* pq)
{
assert(pq);
QNode* cur = pq->head;//保存头指针
while (cur)
{
QNode* next = cur->next;//保存需要销毁结点的下一个结点,防止释放掉后找不到
free(cur);
cur = next;
}
pq->head = pq->tail = NULL;//头尾指针全置空
pq->size = 0;//有效元素置0
}
//计算队列的元素的数量
int QueueSize(Que* pq)
{
return pq->size;
}
新人博主创作不易,如果感觉文章内容对你有所帮助的话不妨三连一下这个新人博主再走呗。你们的支持就是我更新的动力!!!
**(可莉请求你们三连支持一下博主!!!点击下方评论点赞收藏帮帮可莉吧)**
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。