当前位置:   article > 正文

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

链队列代码实现

一、队列的基本操作

1.初始化队列

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

2.队列判空

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

3.入队操作

根据队列先进先出的原理,我们可以通过尾插法实现队列的单向操作,即从尾结点入队元素;
  • 1
//入队操作(头插法符合头出尾进的原理)
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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

4.出队操作

定义一个与所存放的元素类型相同的变量x,用于返回出队的元素 ;
  • 1
//出队操作
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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/139102
推荐阅读
相关标签
  

闽ICP备14008679号