当前位置 博文首页 > ice_elephant的博客:链式队列实现
如图:
结构
typedef struct _Node{
int date;
_Node *next;
} Node;
//这个队列"链表"带了长度,
typedef struct _Queue{
int length;
Node front;
Node rear;
}
/
链式队列,特点使用指针
1、队列初始化
2、判断队列元素是否已满
3、判断队列是否为空
4、入队
5、出队
6、获取头元素
7、出列所有元素
8、队列遍历
*/
/*
链式队列,特点使用指针
1、队列初始化
2、判断队列元素是否已满
3、判断队列是否为空
4、入队
5、出队
6、获取头元素
7、出列所有元素
8、队列遍历
*/
#include<iostream>
#include<Windows.h>
using namespace std;
#define MAX_SIZE 5
typedef int dateType;
typedef struct _QNode{
dateType date;
struct _QNode *next;
}QNode;
typedef struct _Queue{
int length;
QNode *front;
QNode *rear;
}Queue;
//1、队列初始化
bool initQueue(Queue *&LQ){
if(!LQ) return false;
LQ->front = NULL;
LQ->rear = NULL;
return true;
}
//2、判断队列是否为空
bool isEmpty(Queue *&LQ){
if(LQ->front==NULL){
return true;
}
return false;
}
//3、判断队列是否已满了
bool isFully(Queue *&LQ){
if(LQ->length==MAX_SIZE){
return true;
}
return false;
}
//4、判断添加元素
bool addQueue(Queue *&LQ,dateType date){
if(!LQ) return false;
if(isFully(LQ)){ cout<<"队列已满,无法添加!"<<endl;
return false;
}
//在尾部添加元素,有两种情况,第一队列为空的情况下需要吧头节点也指向第一个元素
//否则直接尾部当前结点的next指向元素,并将rear指向当前结点
_QNode * tmp = new _QNode;
tmp->date = date;
tmp->next = NULL;
if(isEmpty(LQ)){
LQ->front=LQ->rear=tmp;
}else{
LQ->rear->next = tmp;
LQ->rear = tmp;
}
LQ->length++;
cout<<"成功添加元素:"<<date<<"\t";
return true;
}
//5、出队
bool deleteType(Queue *&LQ,dateType *date){
//出头节点,不为空的情况下如果只有一个元素,出来之后要把rear也置NULL
if(isEmpty(LQ)){
cout<<"队列为空"<<endl;
return false;
}
if(!LQ) return false;
QNode *tmp;
tmp = LQ->front;
*date = tmp->date;
LQ->front = tmp->next;
if(LQ->front==NULL) LQ->rear = NULL;
LQ->length--;
delete tmp;
return true;
}
//6、销毁
void deleteQueue(Queue *&LQ){
if(!LQ||isEmpty(LQ)){
return ;
}
QNode *tmp ;
while(LQ->front){
tmp = LQ->front;
cout<<"出队元素"<<tmp->date<<"\t";
LQ->front = LQ->front->next;
delete tmp;
}
cout<<"\t";
}
//7、遍历元素
void getHeadQueue(Queue *&LQ,dateType *date){
if(!LQ) return ;
if(isEmpty(LQ)) {
cout<<"队列为空"<<endl;
return;
}
if(!date) return ;
*date = LQ->front->date;
}
//遍历
void printQueue(Queue *&LQ){
if(!LQ) return;
if(isEmpty(LQ)) return ;
QNode *tmp = LQ->front;
while(tmp){
cout<<tmp->date<<"\t";
tmp = tmp->next;
}
}
int main(void){
//测试这个叫 循环队列
Queue *Q = new Queue;
if(initQueue(Q)){
cout<<"队列初始化成功!"<<endl;
}else{
cout<<"队列初始化失败"<<endl;
}
int date;
//插入元素
cout<<"请输入元素:";
for(int i=0;i<5;i++){
cin>>date;
addQueue(Q,date);
}
cout<<"获取头结点元素:"<<endl;
cout<<"删除元素:"<<endl;
for(int i=0;i<5;i++){
deleteType(Q,&date);
cout<<"deleteType:"<<date<<"\t";
getHeadQueue(Q,&date);
cout<<"getHeadQueue:"<<date<<"\t";
}
cout<<"遍历元素:";
printQueue(Q);
system("pause");
return 0;
}
cs