pra.c
#include <malloc.h>
#include <assert.h>
#include <stdio.h>
QNode* BuyQueueNode(DataType data)
{
QNode* newnode = (QNode*)malloc(sizeof(QNode));
if (newnode == NULL)
{
assert(0);
return NULL;
}
newnode->data = data;
newnode->next = NULL;
return newnode;
}
void QueueInit(Queue* q)
{
assert(q);
q->back = q->front = BuyQueueNode(0);
}
// 入队列
void QueuePush(Queue* q, DataType data)
{
assert(q);
q->back->next = BuyQueueNode(data);
q->back=q->back->next;
}
// 出队列
void QueuePop(Queue* q)
{
QNode* delNode = NULL;
if (QueueEmpty(q))
return;
delNode = q->front->next;
q->front->next = delNode->next;
// 队列中只有1个元素,将该元素删除之后,需要让back指向头节点的位置
if (NULL == delNode->next)
q->back = q->front;
free(delNode);
}
// 获取队头元素
DataType QueueFront(Queue* q)
{
assert(!QueueEmpty(q));
return q->front->next->data;
}
// 获取队尾元素
DataType QueueBack(Queue* q)
{
assert(!QueueEmpty(q));
return q->back->data;
}
// 获取队列中有效元素的个数
int QueueSize(Queue* q)
{
assert(q);
int count = 0;
QNode* cur = q->front->next;
while (cur)
{
++count;
cur = cur->next;
}
return count;
}
// 检测队列是否为空
int QueueEmpty(Queue* q)
{
assert(q);
return NULL == q->front->next;
}
// 将队列销毁掉
void QueueDestroy(Queue* q)
{
assert(q);
QNode* cur = q->front;
while (cur)
{
q->front = cur->next;
free(cur);
cur = q->front;
}
q->front = q->back = NULL;
}
//
void TestQueue()
{
Queue q;
QueueInit(&q);
QueuePush(&q, 1);
printf("size = %d\n", QueueSize(&q));
printf("front = %d\n", QueueFront(&q));
printf("back = %d\n", QueueBack(&q));
QueuePush(&q, 2);
QueuePush(&q, 3);
QueuePush(&q, 4);
QueuePush(&q, 5);
printf("size = %d\n", QueueSize(&q));
printf("front = %d\n", QueueFront(&q));
printf("back = %d\n", QueueBack(&q));
QueuePop(&q);
printf("size = %d\n", QueueSize(&q));
printf("front = %d\n", QueueFront(&q));
printf("back = %d\n", QueueBack(&q));
QueuePop(&q);
QueuePop(&q);
QueuePop(&q);
printf("size = %d\n", QueueSize(&q));
printf("front = %d\n", QueueFront(&q));
printf("back = %d\n", QueueBack(&q));
QueuePop(&q);
printf("size = %d\n", QueueSize(&q));
if (QueueEmpty(&q))
{
printf("EMPTY!!!\n");
}
else
{
printf("Error!!!\n");
}
QueueDestroy(&q);
}
pra.h
// 此处采用带头节点的单链表来实现队列
//当插入新元素,尾指针back向后移动,删除元素,头指针front向后移动
typedef int DataType;
typedef struct QNode
{
struct QNode* next;
DataType data;
}QNode;
typedef struct Queue
{
QNode* front;
QNode* back;
}Queue;
void QueueInit(Queue* q);
// 入队列
void QueuePush(Queue* q, DataType data);
// 出队列
void QueuePop(Queue* q);
// 获取队头元素
DataType QueueFront(Queue* q);
// 获取队尾元素
DataType QueueBack(Queue* q);
// 获取队列中有效元素的个数
int QueueSize(Queue* q);
// 检测队列是否为空
int QueueEmpty(Queue* q);
// 将队列销毁掉
void QueueDestroy(Queue* q);
//
void TestQueue();
QNode* BuyQueueNode(DataType data);