数据结构之带优先级的队列(C语言实现)

21 篇文章 20 订阅
12 篇文章 0 订阅

数据结构之带优先级的队列(C语言实现)

    对于带优先级的队列有四种情况:优先级有序顺序队列,优先级无序顺序队列,优先级有序链表队列和优先级无序链表队列。下面将列出这四种优先级队列的对比,另外在这里我们只实现优先级有序的链表队列(使用最多).


        对于带优先级的有序队列而言,其数据结构本质是一个有序链表,只不过是每次插入删除的操作封装成和队列一样。有了我上一篇博客的基础,下面就不多说废话,直接上代码。

//PQueue.h

#pragma once
#include<stdio.h>
#include<stdlib.h>

typedef struct _Item
{
int data; //数据
int prio; //优先级,值越小,优先级越高
}Item;
typedef struct _PNode
{
Item item;
struct _PNode *next;
}PNode, *PQueue;

void InitPQueue(PQueue pQueue); //初始化队列
PNode* BuyNode(Item item); //从堆中申请一个节点的内存空间
void Push(PQueue pQueue, Item item); //入队,从队尾(rear)入
bool Pop(PQueue pQueue, Item *pItem); //出队,从队首(front)出
int GetPQueueLen(PQueue pQueue); //获取队列长度
void ShowQueue(PQueue pQueue); //输出队列所有元素
bool IsEmpty(PQueue pQueue); //队列为空则返回true
bool GetFront(PQueue pQueue, Item *pItem); //获取队首元素
void Destroy(PQueue pQueue); //销毁队列(释放所有节点的内存空间)


//PQueue.c

#include"PQueue.h"


int main()
{
PNode head;
InitPQueue(&head);
Item item = { 3, 6 };
Push(&head, item);
item.data = 5;
item.prio = 3;
Push(&head, item);
item.data = 1;
item.prio = 8;
Push(&head, item);
item.data = 5;
item.prio = 1;
Push(&head, item);
item.data = 5;
item.prio = 3;
Push(&head, item);
ShowQueue(&head);
while (!IsEmpty(&head))
{
Pop(&head, &item);
printf("优先级:%d\n", item.prio);
printf("数据:%d\n", item.data);
}
Destroy(&head);
return 0;
}


//初始化队列
void InitPQueue(PQueue pQueue)
{
if (NULL == pQueue)
return;
pQueue->next = NULL;
}


//从堆中申请一个节点的内存空间
PNode* BuyNode(Item item)
{
PNode *pTmp = (PNode*)malloc(sizeof(PNode));
pTmp->item = item;
pTmp->next = NULL;
return pTmp;
}


//入队
void Push(PQueue pQueue, Item item)
{
PNode *pTmp = BuyNode(item);
PNode *pPre = pQueue;
PNode *pCur = pQueue->next;
while (NULL != pCur)
{
if (pCur->item.prio > item.prio)
{
pTmp->next = pCur;
pPre->next = pTmp;
return;
}
else
{
pPre = pCur;
pCur = pCur->next;
}
}
pPre->next = pTmp;
}


//出队,从队首(front)出
bool Pop(PQueue pQueue, Item *pItem)
{
if (!IsEmpty(pQueue))
{
PNode *pTmp = pQueue->next;
*pItem = pTmp->item;
pQueue->next = pTmp->next;
free(pTmp);
return true;
}
return false;
}


//获取队列长度
int GetPQueueLen(PQueue pQueue)
{
int iCount = 0;
PNode *pCur = pQueue->next;
while (NULL != pCur)
{
++iCount;
pCur = pCur->next;
}
return iCount;
}


//输出队列所有元素
void ShowQueue(PQueue pQueue)
{
PNode *pCur = pQueue->next;
while (NULL != pCur)
{
printf("优先级:%d\n", pCur->item.prio);
printf("数据:%d\n", pCur->item.data);
pCur = pCur->next;
}
printf("\n");
}


//队列为空则返回true
bool IsEmpty(PQueue pQueue)
{
return pQueue->next == NULL;
}


//获取队首元素
bool GetFront(PQueue pQueue, Item *pItem)
{
if (!IsEmpty(pQueue))
{
*pItem = pQueue->item;
return true;
}
return false;
}


//销毁队列(释放所有节点的内存空间)
void Destroy(PQueue pQueue)
{
PNode *pCur = pQueue->next;
while (NULL != pCur)
{
pQueue = pCur->next;
free(pCur);
pCur = pQueue;
}
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值