您的位置:首页 > 理论基础 > 数据结构算法

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

2016-12-01 21:48 453 查看

数据结构之带优先级的队列(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;

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息