数据结构之队列(链式存储),实现优先队列

我们在打王者或者英雄联盟时,游戏中的防御塔总是先打大炮车,打完大炮车再打小兵。这里就用到优先队列,大炮车的优先级高,小兵的优先级低,所有防御塔会优先打大炮车。
优先队列大部分和链式队列一样,只是出队方式和链式队列骚骚有点区别。
不说了,上代码

#include <iostream>

#define MAX_SIZE 5

using namespace std;
typedef int DataType;
typedef struct _QNode
{
	int priority;
	DataType data;
	struct _QNode* next;
}QNode;

typedef QNode* QueuePtr;
typedef struct
{
	int length;
	QueuePtr front;
	QueuePtr rear;
}LinkQueue;

//初始化
bool initQueue(LinkQueue* &LQ)
{
	LQ = new LinkQueue;
	if (!LQ) return false;
	LQ->length = 0;
	LQ->front = LQ->rear = NULL;
	return true;
}

//判断是否为空
bool isEmpty(LinkQueue* &LQ)
{
	if (!LQ || LQ->length == 0) return true;
	return false;
}

//判断是否为满
bool isFull(LinkQueue*& LQ)
{
	if (!LQ) return false;
	if (LQ->length == MAX_SIZE) return true;
	return false;
}

//入队
bool enterQueue(LinkQueue*& LQ, DataType data, int priority)
{
	if (!LQ) return false;
	if (isFull(LQ))
	{
		cout << "队列已满" << endl;
		return false;
	}
	QueuePtr tmp = new QNode;
	tmp->data = data;
	tmp->priority = priority;
	tmp->next = NULL;
	if (isEmpty(LQ))
	{
		LQ->front = LQ->rear = tmp;
	}
	else
	{
		LQ->rear->next = tmp;
		LQ->rear = tmp;
	}
	LQ->length++;
	return true;
}

//输出
void printQueue(LinkQueue*& LQ)
{
	if (!LQ || isEmpty(LQ)) {
		cout << "队列为空!" << endl;
		return;
	}
	QueuePtr tmp = NULL;
	tmp = LQ->front;
	while (tmp)
	{
		cout << tmp->data << "\t";
		tmp = tmp->next;
	}
	cout << endl;
}

//出队
bool deleteQueue(LinkQueue*& LQ,DataType *data)
{
	if (!LQ || isEmpty(LQ)) return false;
	if (!data) return false;
	QNode **prev = NULL, *prev_node = NULL;
	QNode *last = NULL, *tmp = NULL;

	prev = &(LQ->front);
	cout << "第一个节点的优先级:" << (*prev)->priority << endl;
	last = LQ->front;
	tmp = last->next;
	while (tmp)
	{
		if (tmp->priority > (*prev)->priority)
		{
			cout << "抓到个更大优先级的节点,priority:" 
				<< tmp->priority << endl;
			prev = &last->next;
			prev_node = last;
		}
		last = tmp;
		tmp = tmp->next;	
	}
	*data = (*prev)->data;
	tmp = *prev;
	*prev = tmp->next;
	delete tmp;
	LQ->length--;
	
	//1.删除的是首节点
	if (LQ->length == 0) LQ->rear = LQ->front = NULL;

	//2.删除的是尾部节点
	if (prev_node && prev_node->next==NULL)
	{
		LQ->rear = prev_node;
	}
	return true;
}

int getLength(LinkQueue* &LQ)
{
	if (!LQ || isEmpty(LQ)) return 0;
	return LQ->length;
}

//清除
void clearQueue(LinkQueue*& LQ)
{
	if (!LQ) return;
	QueuePtr tmp = NULL;
	while (LQ->front)
	{
		tmp = LQ->front;
		LQ->front =tmp->next;
		delete tmp;
	}
	LQ->front = LQ->rear = NULL;
	LQ->length = 0;
}

int main()
{
	LinkQueue* LQ;
	DataType data = -1;
	initQueue(LQ);
	for (int i = 0; i < 10; i++)
	{
		if (enterQueue(LQ,i+10,i))
		{
			cout << "入队成功!" << endl;
		} 
		else
		{
			cout << "入队失败!" << endl;
		}
	}
	cout << "队列长度:" << getLength(LQ) << endl;
	printQueue(LQ);
	for (int i = 0; i < 3; i++)
	{
		if (deleteQueue(LQ, &data))
		{
			cout << "元素:" << data << "成功出队!" << endl;
		}
		else
		{
			cout << "出队失败" << endl;
		}
	}
	printQueue(LQ);
	cout << "队列长度:" << getLength(LQ) << endl;
	system("pause");
	return 0;
}

打印:
在这里插入图片描述
如果出现二级指针错误,可以看一下:
二级指针常见错误

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值