一、引入
什么时候使用链队?
若用户无法估计所用队列的长度,则宜采用链队列
链式队列的表示(Q.front指向头结点,Q.rear指向尾结点)
二、链队基本操作
链队列的类型定义
#define MAXQSIZE 100
typedef struct Qnode{
int data;
struct Qnode *next;
}QNode,*QueuePtr; //一个结点变量,一个指针变量,pointer缩写Ptr
typedef struct
{
QueuePtr front; //队头指针
QueuePtr rear; //队尾指针
}LinkQueue;
链队列初始化
bool InitQueue(LinkQueue &Q){
Q.front=Q.rear=new QNode;
if(Q.front)
exit(false); //一般来说不需要这一步,因为内存很大
Q.front->next=NULL; //头结点指针域置空
return OK;
销毁链队列
bool DestoryQueue(LinkQueue &Q){
while(Q.front){
p=Q.front->next;
delete Q.front;
Q.front=p;//或者写Q.rear=Q.front0->next;free(Q.front);Q.front=Q.rear;
}
return true;
}
链队的入队
bool EnQueue(LinkQueue &Q,int e)
{
QNode *p=new QNode;//指针p指向为入队元素分配的结点空间
p->data=e;
p->next =NULL;
Q.rear->next=p;
Q.rear=p; //这两步将新结点插入队尾
Q.rear=p; //修改队尾指针
return true;
}
链队的出队
bool DeQueue(LinkList &Q,int &e)
{
if(Q.front==Q.rear)
return false;
p=Q.front->next;//p指向队头元素
e=p->data;
Q.front->next=p->next;//修改头指针
if(Q.rear==p)
Q.rear=Q.front;//头结点下一结点就是尾结点时
delete p;
return true;
}
求链队的队头元素
int GetHead(LinkQueue Q)
{
if(Q.front!=Q.rear)//队列非空
return Q.front->next->data;//返回队头元素,队头指针不变
}
三、链队的简单实现
#include<bits/stdc++.h>
using namespace std;
typedef struct Qnode{
int data;
struct Qnode *next;
}QNode,*QueuePtr; //一个结点变量,一个指针变量,pointer缩写Ptr
typedef struct
{
QueuePtr front; //队头指针
QueuePtr rear; //队尾指针
}LinkQueue;
bool InitQueue(LinkQueue &Q)
{
Q.front=Q.rear=new QNode;
Q.front->next=NULL; //头结点指针域置空
return true;
}
bool DestoryQueue(LinkQueue &Q){
while(Q.front){
QNode *p=Q.front->next;
delete Q.front;
Q.front=p;//或者写Q.rear=Q.front0->next;free(Q.front);Q.front=Q.rear;
}
return true;
}
bool EnQueue(LinkQueue &Q,int e)
{
QNode *p=new QNode;//指针p指向为入队元素分配的结点空间
p->data=e;
p->next=NULL;
Q.rear->next=p;
Q.rear=p; //这两步将新结点插入队尾
Q.rear=p; //修改队尾指针
return true;
}
bool DeQueue(LinkQueue &Q,int &e)
{
if(Q.front==Q.rear)
return false;
QNode *p=Q.front->next;//p指向队头元素
e=p->data;
Q.front->next=p->next;//修改头指针
if(Q.rear==p)
Q.rear=Q.front;//头结点下一结点就是尾结点时
delete p;
return true;
}
int GetHead(LinkQueue Q)
{
if(Q.front!=Q.rear)//队列非空
return Q.front->next->data;//返回队头元素,队头指针不变
}
int main()
{
int n;
LinkQueue Q;
cout<<"链队的初始化:"<<endl;
InitQueue(Q);
cout<<"链队列创建成功"<<endl;
cout<<"链队列的入队"<<endl;
for(int i=0;i<10;i++)
{
EnQueue(Q,i);
}
cout<<"链队入队成功"<<endl;
cout<<"取队头元素"<<endl;
//int m=GetHead(Q);
cout<<GetHead(Q)<<endl;
cout<<"链队出队"<<endl;
for(int i=0;i<10;i++)
{
int k;
DeQueue(Q,k);
cout<<k<<" ";
}
cout<<endl;
cout<<"销毁链队"<<endl;
DestoryQueue(Q);
cout<<"链队销毁成功"<<endl;
}