链队的基本操作和简单实现

一、引入

什么时候使用链队?
若用户无法估计所用队列的长度,则宜采用链队列
链式队列的表示(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; 
} 

在这里插入图片描述

发布了34 篇原创文章 · 获赞 85 · 访问量 4615

猜你喜欢

转载自blog.csdn.net/weixin_45895026/article/details/103973975