队列特点:队头进,队尾出
创建一个结构体,成员有需要进队的元素和该元素的下个结点指向的地址,由于队列的特点,为了方便控制队头队尾进出,又创建一个结构体,存放分别指向队头和队尾的俩指针。
队列创建时遇到的问题
问题一:野指针问题
问题2:push元素时,忽略了此时队尾发生了改变
问题3:队列销毁销毁的对象搞错
队列创建正确代码:
// 初始化队列
void QueueInit(Queue* q)
{
q->_front = NULL;
q->_rear = NULL;
q->size = 0;
}
// 队尾入队列
void QueuePush(Queue* q, QDataType n)
{
assert(q);
QNode* newnode = (QNode*)malloc(sizeof(QNode));
if (newnode == NULL)
{
perror("malloc fail");
exit(-1);
}
newnode->_data = n;
newnode->_next = NULL;
//判断队列是否为空
if (q->_rear == NULL)
{
//队列为空,直接入列
q->_front = q->_rear = newnode;
}
else
{
q->_rear->_next = newnode;
q->_rear =newnode;
}
q->size++;
}
// 队头出队列
void QueuePop(Queue* q)
{
assert(q);
if (q->_rear == NULL)
{
q->_front = NULL;
}
QNode* cur = q->_front;
QNode* next = q->_front;
q->_front = next->_next;
free(cur);
cur=NULL;
q->size--;
}
// 获取队列头部元素
QDataType QueueFront(Queue* q)
{
assert(q);
return q->_front->_data;
}
// 获取队列队尾元素
QDataType QueueBack(Queue* q)
{
assert(q);
return q->_rear->_data;
}
// 获取队列中有效元素个数
int QueueSize(Queue* q)
{
return q->size;
}
// 检测队列是否为空,如果为空返回非零结果,如果非空返回0
int QueueEmpty(Queue* q)
{
if (q->size == 0)
{
return 1;
}
else
{
return 0;
}
}
// 销毁队列
void QueueDestroy(Queue* q)
{
assert(q);
QNode *cur= q->_front;
QNode* next = q->_front;
while (next)
{
free(cur);
cur = next->_next;
next = next->_next;
}
q->_front = q->_rear = NULL;
}