Test.c
# include "Queue.h"
void TestQueue ( )
{
Queue q;
QueueInit ( & q) ;
QueuePush ( & q, 1 ) ;
QueuePush ( & q, 2 ) ;
QueuePush ( & q, 3 ) ;
QueuePush ( & q, 4 ) ;
QueuePush ( & q, 5 ) ;
while ( ! QueueEmpty ( & q) )
{
printf ( "%d " , QueueFront ( & q) ) ;
QueuePop ( & q) ;
}
printf ( "\n" ) ;
}
int main ( )
{
TestQueue ( ) ;
return 0 ;
}
Queue.h
# define _CRT_SECURE_NO_WARNINGS 1
# pragma once
# include <stdio.h>
# include <stdlib.h>
# include <assert.h>
# include <stdbool.h>
typedef int QDataType;
typedef struct QueueNode
{
struct QueueNode * next;
QDataType data;
} QNode;
typedef struct Queue
{
int size;
QNode* head;
QNode* tail;
} Queue;
void QueueInit ( Queue* pq) ;
void QueueDestroy ( Queue* pq) ;
void QueuePush ( Queue* pq, QDataType x) ;
void QueuePop ( Queue* pq) ;
QDataType QueueFront ( Queue* pq) ;
QDataType QueueBack ( Queue* pq) ;
bool QueueEmpty ( Queue* pq) ;
int QueueSize ( Queue* pq) ;
Queue.c
# define _CRT_SECURE_NO_WARNINGS 1
# include "Queue.h"
void QueueInit ( Queue* pq)
{
assert ( pq) ;
pq-> size = 0 ;
pq-> head = pq-> tail = NULL ;
}
void QueueDestroy ( Queue* pq)
{
assert ( pq) ;
QNode* cur = pq-> head;
while ( cur)
{
QNode* next = cur-> next;
free ( cur) ;
cur = next;
}
pq-> head = pq-> tail = NULL ;
}
void QueuePush ( Queue* pq, QDataType x)
{
assert ( pq) ;
QNode* newnode= ( QNode* ) malloc ( sizeof ( QNode) ) ;
if ( NULL == newnode)
{
printf ( "malloc fail\n" ) ;
exit;
}
newnode-> data = x;
newnode-> next = NULL ;
if ( NULL == pq-> tail)
{
pq-> head = pq-> tail = newnode;
}
else
{
pq-> tail-> next = newnode;
pq-> tail = newnode;
}
pq-> size++ ;
}
void QueuePop ( Queue* pq)
{
assert ( pq) ;
assert ( ! QueueEmpty ( pq) ) ;
if ( NULL == pq-> head-> next)
{
free ( pq-> head) ;
pq-> head = pq-> tail = NULL ;
}
else
{
QNode* next = pq-> head-> next;
free ( pq-> head) ;
pq-> head = next;
}
pq-> size-- ;
}
QDataType QueueFront ( Queue* pq)
{
assert ( pq) ;
assert ( ! QueueEmpty ( pq) ) ;
return pq-> head-> data;
}
QDataType QueueBack ( Queue* pq)
{
assert ( pq) ;
assert ( ! QueueEmpty ( pq) ) ;
return pq-> tail-> data;
}
bool QueueEmpty ( Queue* pq)
{
assert ( pq) ;
return NULL == pq-> head;
}
int QueueSize ( Queue* pq)
{
return pq-> size;
}