链队列——-链式存储实现队列的入队出队(带next,front,rear指针)

在学习链队列之前,我们可以先复习巩固一下链表实现循环队列。
原文博客如下 链表实现循环队列

目录

    • 一、链队列的特点
    • 二、代码实现
      • 结构体(2个)
      • 1.初始化队列
      • 2.判断队列是否为空
      • 3.入队(尾插法)
      • 4.出队(头部删除)
      • 完整代码

一、链队列的特点

队列的链式表示称为链队列。它是一个同时带有队头指针和队尾指针的单链表,其中队头指针指队头,队尾指针指队尾。

链队列——-链式存储实现队列的入队出队(带next,front,rear指针)_第1张图片

二、代码实现

结构体(2个)

typedef int ElemType;
typedef struct LinkNode {
	ElemType data;
	struct LinkNode* next;
}LinkNode, * LinkList;

typedef struct {
	LinkNode* front, * rear;// 链表头 链表尾
}LinkQueue; // 先进先出

1.初始化队列

// 初始化队列
void InitQueue(LinkQueue& Q) {
	// 申请空间
	Q.front = Q.rear = (LinkList)malloc(sizeof(LinkNode));
	Q.front->next = NULL;
}

2.判断队列是否为空

// 判断队列是否为空
bool isEmpty(LinkQueue Q) {
	if (Q.front == Q.rear) {
		return true;
	}
	return false;
}

3.入队(尾插法)

// 入队,尾插法
void EnQueue(LinkQueue& Q, ElemType e) {
	// 给新元素申请空间
	LinkList s = (LinkList)malloc(sizeof(LinkNode));
	s->data = e;
	s->next = NULL;
	Q.rear->next = s; // rear始终指向尾部
	Q.rear = s;
}

4.出队(头部删除)

// 出队,头部删除
bool DeQueue(LinkQueue& Q, ElemType& e) {
	if (isEmpty(Q)) {
		return false;
	}
	LinkList p = Q.front->next; // 要指向有数据的,头结点什么都没有存
	e = p->data;
	Q.front->next = p->next; // 断链
	// 删除的是最后一个元素,将队列置为空
	if (Q.rear == p) {
		Q.rear == Q.front;
	}
	free(p); //释放
	p = NULL;
	return true;
}

完整代码

#define _CRT_SECURE_NO_WARNINGS
#include
#include

typedef int ElemType;
typedef struct LinkNode {
	ElemType data;
	struct LinkNode* next;
}LinkNode, * LinkList;

typedef struct {
	LinkNode* front, * rear;// 链表头 链表尾
}LinkQueue; // 先进先出

// 初始化队列
void InitQueue(LinkQueue& Q) {
	// 申请空间
	Q.front = Q.rear = (LinkList)malloc(sizeof(LinkNode));
	Q.front->next = NULL;
}

// 判断队列是否为空
bool isEmpty(LinkQueue Q) {
	if (Q.front == Q.rear) {
		return true;
	}
	return false;
}

// 入队,尾插法
void EnQueue(LinkQueue& Q, ElemType e) {
	// 给新元素申请空间
	LinkList s = (LinkList)malloc(sizeof(LinkNode));
	s->data = e;
	s->next = NULL;
	Q.rear->next = s; // rear始终指向尾部
	Q.rear = s;
}

// 出队,头部删除
bool DeQueue(LinkQueue& Q, ElemType& e) {
	if (isEmpty(Q)) {
		return false;
	}
	LinkList p = Q.front->next; // 要指向有数据的,头结点什么都没有存
	e = p->data;
	Q.front->next = p->next; // 断链
	// 删除的是最后一个元素,将队列置为空
	if (Q.rear == p) {
		Q.rear == Q.front;
	}
	free(p); //释放
	p = NULL;
	return true;
}

int main()
{
	LinkQueue Q;
	ElemType m; // 存储出队的元素
	InitQueue(Q); // 初始化队列
	// 入队
	EnQueue(Q, 3);
	EnQueue(Q, 4);
	EnQueue(Q, 5);
	EnQueue(Q, 6);
	EnQueue(Q, 7);
	// 出队
	bool ret;
	ret = DeQueue(Q, m);
	if (ret) {
		printf("出队成功,值为%d\n", m);
	}
	else {
		printf("出队失败\n");
	}
	return 0;
}

在这里插入图片描述

明天开始学二叉树,一定要坚持啊()

你可能感兴趣的:(考研-数据结构,链表,数据结构)