优先队列
入队循序没有变化,但出队时按优先级出队,优先级高的先出队
#include<iostream>
#include<iomanip>
#define MAX_SIZE 5//队列最大容量
using namespace std;
typedef int DataType; //元素类型
typedef struct _Qnode {//节点结构
int priority;//优先级
DataType data;
struct _Qnode* next;
}Qnode;
typedef Qnode* QnodePrt;
typedef struct Queue {
int length;//队列长度
QnodePrt front;//队头指针
QnodePrt 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;
}
else {
return 0;
}
}
//判断是否已满
int IsFull(LinkQueue* LQ){
if (!LQ)return 0;
if (LQ->length == MAX_SIZE) {
return 1;
}
else {
return 0;
}
}
//元素入队
int insertLinkQueue(LinkQueue* LQ, DataType data, int priority) {
if (!LQ)return 0;
if (IsFull(LQ)) {
cout << "元素已满" << endl;
return 0;
}
Qnode* node = new Qnode;
node->data = data;
node->priority = priority;
node->next = NULL;
if (IsEmpty(LQ)) {
LQ->front = LQ->rear = node;
}
else {
LQ->rear->next = node;
LQ->rear = node;
}
LQ->length++;
return 1;
}
//出队
int deleteLinkQueue(LinkQueue* LQ, DataType* data) {
Qnode** prev = NULL, * prev_node = NULL,//prev二级指针存最高的优先级地址,prev_node存上一个元素地址
* last = NULL, * tmp = NULL;//last存自己地址,tmp存下一个元素地址
if (!LQ || IsEmpty(LQ)) {
cout << "队列为空" << endl;
return 0;
}
if (!data)return 0;
prev = &(LQ->front);//将头地址给二级指针
cout << "第一个节点的优先级" << (*prev)->priority << endl;
last = LQ->front;
tmp = last->next;
while (tmp) {
if (tmp->priority > (*prev)->priority) {
cout << "捕捉到更高优先级" <<"\t\t" << tmp->priority << endl;
prev = &(last->next);//&(tmp)
prev_node = last;
}
last = tmp;
tmp = tmp->next;
}
*data = (*prev)->priority;
tmp = *prev;
*prev = (*prev)->next;
delete tmp;
LQ->length--;
//两种特殊情况
//首节点长度为0
if (LQ->length == 0) {
LQ->rear = NULL;
}
//删掉的为尾结点
if (prev_node && prev_node->next == NULL) {
LQ->rear = prev_node;
}
return 1;
}
//打印
void printfLinkQueue(LinkQueue* LQ) {
if (!LQ || IsEmpty(LQ)) {
cout << "无数据" << endl;
return;
}
QnodePrt tmp;
tmp = LQ->front;
while (tmp) {
cout << setw(4) << tmp->data << "\n\n" << tmp->priority << endl;
tmp = tmp->next;
}
}
int main() {
LinkQueue* LQ = new LinkQueue;
DataType data;
InItQueue(LQ);
for (int i = 0; i < 6; i++) {
insertLinkQueue(LQ, i, i);
}
//printfLinkQueue(LQ);
for (int i = 0; i < 6; i++) {
deleteLinkQueue(LQ,&data);
}
// printfLinkQueue(LQ);
}