队列学习-单链表队列

队列学习-单链表队列

1. 单链表队列定义

#define MAXSIZE 5			//队列的最大容量

typedef int DataType;		//int的别名(队列中的元素类型)

//单链表(结点结构)
typedef struct _QNode {
	DataType data;			//数据域(相当于 int data)
	struct _QNode *next;	//指针域
}QNode;

typedef QNode *QueuePtr;	//QNode的指针变量(QNode * 的别名)

//队列
typedef struct Queue {
	int length;				//队列的长度
	QueuePtr front;			//队头指针(相当于  QNode *front)
	QueuePtr rear;			//队尾指针(相当于  QNode *rear)
}LinkQueue;

2. 单链表队列初始化

//队列初始化,将队列初始化为空队列
void InitQueue(LinkQueue *LQ) {
	if (!LQ) return;

	LQ->length = 0;
	LQ->front = LQ->rear = NULL;	//打队头和队尾指针同时置零
}

3. 判断单链表队列是否为空

//判断队列为空
int IsEmpty(LinkQueue *LQ) {
	if (!LQ) return 0;

	if (LQ->front == NULL) {
		return 1;
	}
	return 0;
}

4. 判断单链表队列是否为满

//判断队列是否为满
int IsFull(LinkQueue *LQ) {
	if (!LQ) return 0;

	if (LQ->length == MAXSIZE) {
		return 1;
	}
	return 0;
}

5. 入队

//入队,将元素data插入到队列LQ中
int EnterQueue(LinkQueue *LQ, DataType data) {
	if (!LQ) return 0;

	if (IsFull(LQ)) {
		cout << "无法插入元素" << data << ",队列已满!" << endl;
		return 0;
	}

	QNode *qNode = new QNode;
	qNode->data = data;
	qNode->next = NULL;

	if (IsEmpty(LQ)) {	//空队列
		LQ->front = LQ->rear = qNode;
	}
	else {
		LQ->rear->next = qNode;			//在队尾插入节点qNode
		LQ->rear = qNode;				//队尾指向新插入的节点
	}
	LQ->length++;
	return 1;
}

6. 出队

//出队, 将队列中队头的元素data出队,后面的元素向前移动
int DeleteQueue(LinkQueue *LQ, DataType *data) {
	QNode *tmp = NULL;

	if (!LQ || IsEmpty(LQ)) {
		cout << "队列为空!" << endl;
		return 0;
	}

	if (!data) return 0;

	tmp = LQ->front;

	LQ->front = tmp->next;

	if (!LQ->front) LQ->rear = NULL;	//如果队头出列后不存在其他元素,则rear节点也要置空

	*data = tmp->data;
	LQ->length--;

	delete tmp;

	return 1;

}

7. 打印单链表队列中的全部元素

//打印队列中的各元素
void PrintQueue(LinkQueue *LQ) {
	QueuePtr tmp;

	if (!LQ) return;

	if (LQ->front == NULL) {
		cout << "队列为空!\n";
		return;
	}

	tmp = LQ->front;
	while (tmp) {
		cout << setw(4) << tmp->data;
		tmp = tmp->next;
	}
	cout << endl;
}

8. 获取单链表队列首元素,不出队

//获取队首元素,不出队
int GetHead(LinkQueue *LQ, DataType *data) {
	if (!LQ || IsEmpty(LQ)) {
		cout << "队列为空!" << endl;
		return 0;
	}

	if (!data) return 0;

	*data = LQ->front->data;
	return 1;
}

9. 清空单链表队列,释放内存资源

//清空队列
void ClearQueue(LinkQueue *LQ) {
	if (!LQ) return;

	while (LQ->front) {
		QueuePtr tmp = LQ->front->next;
		delete LQ->front;
		LQ->front = tmp;
	}
	LQ->front = LQ->rear = NULL;
	LQ->length = 0;
}

10. 获取单链表队列中的数据总个数

//获取队列中元素的个数
int getLength(LinkQueue *LQ) {
	if (!LQ) return 0;

	return LQ->length;
}

11. 测试代码

int main(void) {
	LinkQueue *LQ = new LinkQueue;
	DataType data = -1;

	//初始化队列
	InitQueue(LQ);

	//入队
	for (int i = 0; i < 7; i++) {
		EnterQueue(LQ, i);
	}

	//打印队列中的元素
	cout << "队列中的元素(总共" << getLength(LQ) << "个): " << endl;
	PrintQueue(LQ);
	cout << endl;

	//出队
	//for (int i = 0; i < 10; i++) {
	if (DeleteQueue(LQ, &data)) {
		cout << "出队的元素是: " << data << endl;
	}
	else {
		cout << "出队失败!" << endl;
	}
	//}

	//打印队列中的剩下元素
	cout << "出队一个元素后, 队列中的剩下的元素[" << getLength(LQ) << "]: " << endl;
	PrintQueue(LQ);
	cout << endl;

	ClearQueue(LQ);
	cout << "清空队列!\n";
	PrintQueue(LQ);

	system("pause");
	return 0;
}

12. 运行结果

在这里插入图片描述

12. 完整代码

#include <iostream>
#include <stdio.h>
#include <assert.h>
#include <iomanip>
#include <Windows.h>

using namespace std;

#define MAXSIZE 5			//队列的最大容量

typedef int DataType;		//int的别名(队列中的元素类型)

//单链表(结点结构)
typedef struct _QNode {
	DataType data;			//数据域(相当于 int data)
	struct _QNode *next;	//指针域
}QNode;

typedef QNode *QueuePtr;	//QNode的指针变量(QNode * 的别名)

//队列
typedef struct Queue {
	int length;				//队列的长度
	QueuePtr front;			//队头指针(相当于  QNode *front)
	QueuePtr rear;			//队尾指针(相当于  QNode *rear)
}LinkQueue;

//队列初始化,将队列初始化为空队列
void InitQueue(LinkQueue *LQ) {
	if (!LQ) return;

	LQ->length = 0;
	LQ->front = LQ->rear = NULL;	//打队头和队尾指针同时置零
}

//判断队列为空
int IsEmpty(LinkQueue *LQ) {
	if (!LQ) return 0;

	if (LQ->front == NULL) {
		return 1;
	}
	return 0;
}

//判断队列是否为满
int IsFull(LinkQueue *LQ) {
	if (!LQ) return 0;

	if (LQ->length == MAXSIZE) {
		return 1;
	}
	return 0;
}


//入队,将元素data插入到队列LQ中
int EnterQueue(LinkQueue *LQ, DataType data) {
	if (!LQ) return 0;

	if (IsFull(LQ)) {
		cout << "无法插入元素" << data << ",队列已满!" << endl;
		return 0;
	}

	QNode *qNode = new QNode;
	qNode->data = data;
	qNode->next = NULL;

	if (IsEmpty(LQ)) {	//空队列
		LQ->front = LQ->rear = qNode;
	}
	else {
		LQ->rear->next = qNode;			//在队尾插入节点qNode
		LQ->rear = qNode;				//队尾指向新插入的节点
	}
	LQ->length++;
	return 1;
}

//出队, 将队列中队头的元素data出队,后面的元素向前移动
int DeleteQueue(LinkQueue *LQ, DataType *data) {
	QNode *tmp = NULL;

	if (!LQ || IsEmpty(LQ)) {
		cout << "队列为空!" << endl;
		return 0;
	}

	if (!data) return 0;

	tmp = LQ->front;

	LQ->front = tmp->next;

	if (!LQ->front) LQ->rear = NULL;	//如果队头出列后不存在其他元素,则rear节点也要置空

	*data = tmp->data;
	LQ->length--;

	delete tmp;

	return 1;

}

//打印队列中的各元素
void PrintQueue(LinkQueue *LQ) {
	QueuePtr tmp;

	if (!LQ) return;

	if (LQ->front == NULL) {
		cout << "队列为空!\n";
		return;
	}

	tmp = LQ->front;
	while (tmp) {
		cout << setw(4) << tmp->data;
		tmp = tmp->next;
	}
	cout << endl;
}

//获取队首元素,不出队
int GetHead(LinkQueue *LQ, DataType *data) {
	if (!LQ || IsEmpty(LQ)) {
		cout << "队列为空!" << endl;
		return 0;
	}

	if (!data) return 0;

	*data = LQ->front->data;
	return 1;
}

//清空队列
void ClearQueue(LinkQueue *LQ) {
	if (!LQ) return;

	while (LQ->front) {
		QueuePtr tmp = LQ->front->next;
		delete LQ->front;
		LQ->front = tmp;
	}
	LQ->front = LQ->rear = NULL;
	LQ->length = 0;
}

//获取队列中元素的个数
int getLength(LinkQueue *LQ) {
	if (!LQ) return 0;

	return LQ->length;
}


int main(void) {
	LinkQueue *LQ = new LinkQueue;
	DataType data = -1;

	//初始化队列
	InitQueue(LQ);

	//入队
	for (int i = 0; i < 7; i++) {
		EnterQueue(LQ, i);
	}

	//打印队列中的元素
	cout << "队列中的元素(总共" << getLength(LQ) << "个): " << endl;
	PrintQueue(LQ);
	cout << endl;

	//出队
	if (DeleteQueue(LQ, &data)) {
		cout << "出队的元素是: " << data << endl;
	}
	else {
		cout << "出队失败!" << endl;
	}

	//打印队列中的剩下元素
	cout << "出队一个元素后, 队列中的剩下的元素[" << getLength(LQ) << "]: " << endl;
	PrintQueue(LQ);
	cout << endl;

	ClearQueue(LQ);
	cout << "清空队列!\n";
	PrintQueue(LQ);

	system("pause");
	return 0;
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值