Queue.h
#pragma once
#include <stdio.h>
#include <malloc.h>
#include <assert.h>
#define TRUE 1
#define FALSE 0
typedef int DataType;
typedef struct QueueNode
{
DataType data;
struct QueueNode* next;
}QueueNode;
typedef struct Queue
{
QueueNode* front;
QueueNode* back;
}Queue;
void QueueInit(Queue* pq);
void QueueDestory(Queue* pq);
QueueNode* BuyQueueNode(DataType x);
void QueuePush(Queue* pq, DataType x);
void QueuePop(Queue* pq);
DataType QueueFront(Queue* pq);
int QueueEmpty(Queue* pq);
int QueueSize(Queue* pq);
DataType QueueBack(Queue* pq);
void TestQueue();
Queue.c
#include "Queue.h"
void QueueInit(Queue * Q)
{
Q->front = (QueueNode*)malloc(sizeof(QueueNode));
Q->back = Q->front;
Q->front->next = NULL;
}
void QueueDestory(Queue * Q)
{
assert(Q);
QueueNode *cur = Q->front;
while (cur)
{
Q->front = Q->front->next;
free(cur);
cur = Q->front;
}
Q->front = NULL;
Q->back = NULL;
}
QueueNode * BuyQueueNode(DataType x)
{
QueueNode *NewQueueNode;
NewQueueNode = (QueueNode*)malloc(sizeof(QueueNode));
if (NewQueueNode == NULL)
{
printf("创建队列结点失败\n");
}
NewQueueNode->data = x;
NewQueueNode->next = NULL;
}
void QueuePush(Queue * Q, DataType x)
{
assert(Q);
QueueNode *NewQueueNode;
NewQueueNode = (QueueNode*)malloc(sizeof(QueueNode));
if (NewQueueNode != NULL)
{
NewQueueNode->data = x;
NewQueueNode->next = NULL;
Q->back->next = NewQueueNode;
Q->back = NewQueueNode;
}
}
void QueuePop(Queue * Q)
{
assert(Q);
QueueNode *tmp;
if (Q->front == Q->back)
{
primtf("空队列,不需出队\n");
}
tmp = Q->front->next;
Q->front->next = tmp->next;
if (Q->back == tmp)
{
Q->back = Q->front;
Q->front->next = NULL;
free(tmp);
}
}
DataType QueueFront(Queue * Q)
{
assert(Q);
if (Q->front == Q->back)
{
return FALSE;
}
return Q->front->next->data;
}
int QueueEmpty(Queue * Q)
{
assert(Q);
if (Q->front == Q->back)
{
return TRUE;
}
else
{
return FALSE;
}
}
int QueueSize(Queue * Q)
{
assert(Q);
int count = 0;
while (Q->front->next)
{
count++;
}
return count;
}
DataType QueueBack(Queue * Q)
{
assert(Q);
if (Q->front == Q->back)
{
return FALSE;
}
return Q->back->data;
}