队列的链式优点是不用考虑队满情况。代码如下:
#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;
}