1. 程式人生 > >資料結構之帶優先順序的佇列(C語言實現)

資料結構之帶優先順序的佇列(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;
}
}