队列的特点即只能从队头pop元素出队,从队尾push元素入队;在队列中不能进行pop和push操作。每个节点包含当前数据以及指向下一个节点的指针
typedef int QDataType;
typedef struct QNode
{
struct QNode* _next;
QDataType _data;
}QNode;
对于队列,需要定义头结点和尾结点
typedef struct Queue
{
QNode* _front;
QNode* _tail;
}Queue;
队列初始化时将头指针和尾指针都置为空
void queueInit(Queue* q)
{
q->_front = q->_tail = NULL;
}
每当要入队一个节点时,应该先创建一个新节点,开辟空间,数据赋值为入队节点值,同时指向空。
QNode* creatNode(QDataType val)
{
QNode* node = (QNode*)malloc(sizeof(QNode));
node->_data = val;
node->_next = NULL;
return node;
}
入队节点,先创建一个节点,如果队列为空,那么头指针和尾指针都指向此节点,否则尾指针的next指向该节点,同时更新尾指针指向。
void queuePush(Queue* q,QDataType val)
{
QNode* node = creatNode(val);
if (q->_front == NULL)
q->_front = q->_tail = node;
else
{
q->_tail->_next = node;
q->_tail = node;
}
}
队头节点出队,分别设置指针指向队头节点和队头节点的下一个节点,释放队头节点,更新头指针,如果头指针为空,更新尾指针也为空
void queuePop(Queue* q)
{
if(q->_front)
{
QNode* next = q->_front->_next;
QNode* dNode = q->_front;
free(dNode);
q->_front = next;
if (q->_front == NULL)
q->_tail == NULL;
}
}
查看队首元素和队尾元素及队列判空
QDataType queueFront(Queue* q)
{
return q->_front->_data;
}
QDataType queueBack(Queue* q)
{
return q->_tail->_data;
}
int queueEmpty(Queue* q)
{
if (q->_front == NULL)
return 1;
else
return 0;
}
销毁队列,从队头元素开始,记录下一个元素的位置,销毁节点后更新头指针位置,直至销毁全部队列
void queueDestory(Queue* q)
{
QNode* cur = q->_front;
while (cur)
{
QNode* next = cur->_next;
free(cur);
cur = next;
}
}
测试代码
void test()
{
Queue q;
queueInit(&q);
queuePush(&q, 1);
while (queueEmpty(&q) != 1)
{
queueFront(&q);
queuePop(&q);
}
queueDestory(&q);
}
完成队列相关代码,感恩。