队列的链式优点是不用考虑队满情况。代码如下:

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */

//定义链式队列结点 
typedef struct LinkNode{
	int data;
	struct LinkNode *next;
}LinkNode;

//定义队头尾指针结点(或者叫队列) 
typedef struct {
	LinkNode *rear,*front;
}LinkQueue;

//初始化队列(带头结点) 
void InitQueue(LinkQueue &Q){
	Q.front=Q.rear=(LinkNode*)malloc(sizeof(LinkNode));//队头和队尾指针都指向头结点
	Q.front->next = NULL; 
}

//初始化队列(不带头结点) 
void InitQueue(LinkQueue &Q){
	Q.front=NULL;//队头和队尾指针都指向NULL
	Q.rear=NULL;
}

//判断队列是否为空(带头结点) 
bool isEmpty(LinkQueue Q){
	if(Q.front==Q.rear){
		return true;
	}else{
		return false;
	}
} 

//判断队列是否为空(不带头结点) 
bool isEmpty(LinkQueue Q){
	if(Q.front==NULL){
		return true;
	}else{
		return false;
	}
} 

//入队(带头结点) 
void EnQueue(LinkQueue &Q,int x){
	LinkNode *s = (LinkNode*)malloc(sizeof(LinkNode));
	s->data = x;
	s->next = NULL;
	Q.rear->next = s;//s插入到rear之后 
	Q.rear = s;//修改表尾指针 
}

//入队(不带头结点) 
void EnQueue(LinkQueue &Q,int x){
	LinkNode *s = (LinkNode*)malloc(sizeof(LinkNode));
	s->data = x;
	s->next = NULL;
	if(Q.front==NULL){//队头尾指针指向第一个元素 
		Q.front = s;
		Q.rear = s;
	}else{
		Q.rear->next = s;//s插入到rear之后 
		Q.rear = s;//修改表尾指针 
	}	
}

//出队(带头结点)
bool DeQueue(LinkQueue &Q,int &e)){
	if(Q.front==Q.rear){//队空报错 
		return false;
	}
	LinkNode *q = Q.front->next;//指针q指向被删结点 
	e = q->data;
	Q.front->next = q->next;
	if(Q.rear==q){//最后一个结点情况 
		Q.rear = Q.front; 
	}
	free(q);
	return true;
} 

//出队(不带头结点)
bool DeQueue(LinkQueue &Q,int &e)){
	if(Q.front==NULL){//队空报错 
		return false;
	}
	LinkNode *q = Q.front->next;//指针q指向被删结点 
	e = q->data;
	Q.front = q->next;
	if(Q.rear==q){//最后一个结点情况 
		Q.front=NULL;//队头和队尾指针都指向NULL
		Q.rear=NULL;
	}
	free(q);
	return true;
} 

int main(int argc, char** argv) {
	return 0;
}