链队列的基本操作(附完整代码)

一、队列的基本操作

1.初始化队列

使队列的头指针和尾指针指向同一个结点,注意将front的next域指向NULL;
//初始化链队列
void InitQueue(LinkQueue &Q){
	Q.front=Q.rear=(LinkNode*)malloc(sizeof(LinkNode));
	Q.front->next=NULL;
}

2.队列判空

通过判断队列头指针和尾指针是否指向同一结点即可;
//初始化链队列
bool IsEmpty(LinkQueue Q){
	return (Q.front==Q.rear);//返回一个布尔型的参数,返回1则队列空;返回0则队列非空;
}

3.入队操作

根据队列先进先出的原理,我们可以通过尾插法实现队列的单向操作,即从尾结点入队元素;
//入队操作(头插法符合头出尾进的原理)
bool EnQueue(LinkQueue &Q,ElemType e){
	//由于是链队列,动态申请空间,故不用判断队列是否已满;
	LinkNode*s;
	s=(LinkNode*)malloc(sizeof(LinkNode));//申请一个新结点用于存放数据,并将入队该结点
	s->data=e;
	s->next=NULL;
	Q.rear->next=s;//尾插法,先将队列尾指向该结点;
	Q.rear=s;//该结点成为新的队列尾;
	return true;
}

4.出队操作

定义一个与所存放的元素类型相同的变量x,用于返回出队的元素 ;
//出队操作
bool DeQueue(LinkQueue &Q,ElemType &x){//由于需要改变x,所以要加引用
	if(Q.front==Q.rear){
		return false;}
	LinkNode*q;
	q=Q.front->next;//头结点不存储数据,使q指向第一个存有数据的结点;
	x=q->data;
	Q.front->next=q->next;//使q结点从链表脱离,即“断链”;
	free(q);//不使用该空间后要记得释放掉;
	if(q==Q.rear){//如果出队的是队尾元素,要将队列置空,即让头指针和尾指针指向头结点;
		Q.rear=Q.front;
		Q.front=NULL;}
	return true;
}

5.完整代码

#include <stdio.h>
#include <stdlib.h>
#define ElemType int
//链队列结点
typedef struct LinkNode{
	ElemType data;
	LinkNode *next;
}LinkNode;

//链队列头指针和尾指针
typedef struct {
	LinkNode *front,*rear;
}LinkQueue;

//初始化链队列
void InitQueue(LinkQueue &Q){
	Q.front=Q.rear=(LinkNode*)malloc(sizeof(LinkNode));
	Q.front->next=NULL;}

//入队操作(头插法符合头出尾进的原理)
bool EnQueue(LinkQueue &Q,ElemType e){
	LinkNode*s;
	s=(LinkNode*)malloc(sizeof(LinkNode));
	s->data=e;
	s->next=NULL;
	Q.rear->next=s;
	Q.rear=s;
	return true;
}

//出队操作
bool DeQueue(LinkQueue &Q,ElemType &x){
	if(Q.front==Q.rear){
		return false;}
	LinkNode*q;
	q=Q.front->next;//头结点不存储数据
	x=q->data;
	Q.front->next=q->next;
	free(q);
	if(q==Q.rear){
		Q.rear=Q.front;
		Q.front=NULL;}
	return true;
}

//队列判空
bool IsEmpty(LinkQueue Q){
	return (Q.front==Q.rear);
}

int main(){
	bool ret;
	LinkQueue Q;
	InitQueue(Q);
	ret=EnQueue(Q,3);
	if(ret){
		printf("入队冲冲");}
	else{
		printf("入队失败");}
	return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值