LinkPriorityQueue——链式优先级队列
来源:互联网 发布:阿里云校园扶持计划 编辑:程序博客网 时间:2024/05/16 19:35
直接看代码吧。嘿嘿~
/*** File name: LinkPriorityQueue.h** Author: ZhouFeng** Date: 2012/03/30** LPQ -- LinkPriorityQueue*/#ifndef LINK_PRIORITY_QUEUE_H#define LINK_PRIORITY_QUEUE_H#define ERROR 0#define SUCCESS 1#define BOOL int#define TRUE 1#define FALSE 0typedef int EleDataType;typedef struct EleType{ EleDataType data; int nPriority;}EleType;typedef struct LPQNode{ EleType eleData; struct LPQNode *pNext;}LPQNode;typedef struct LinkPriorityQueue{ int nCount; struct LPQNode *pRear; struct LPQNode *pFront;}LinkPriorityQueue, *PLPQ;void InitLPQ(PLPQ *pLPQAddr);BOOL IsLPQEmpty(PLPQ pLPQ);/* et -- EleType varible. */int LPQAppend(PLPQ pLPQ, EleType et);int LPQDelete(PLPQ pLPQ, EleType *et);int GetLPQ(PLPQ pLPQ, EleType *et);void FreeLPQ(PLPQ *pLPQ);#endif
/*** File name: LinkPriorityQueue.c** Author: ZhouFeng** Date: 2012/03/30** LPQ operation definition.*/#include <stddef.h>#include <stdlib.h>#include "LinkPriorityQueue.h"void InitLPQ(PLPQ *pLPQAddr){ *pLPQAddr = (PLPQ)malloc(sizeof(LinkPriorityQueue)); (*pLPQAddr)->pRear = NULL; (*pLPQAddr)->pFront = NULL; (*pLPQAddr)->nCount = 0;}BOOL IsLPQEmpty(PLPQ pLPQ){ if(pLPQ == NULL) {return TRUE; } if(pLPQ->nCount == 0) {return TRUE; } else {return FALSE; }}int LPQAppend(PLPQ pLPQ, EleType et){ LPQNode *pNewLPQNode; if(pLPQ == NULL) {return ERROR; } pNewLPQNode = (LPQNode*)malloc(sizeof(LPQNode)); pNewLPQNode->eleData.data =et.data; pNewLPQNode->eleData.nPriority = et.nPriority; pNewLPQNode->pNext = NULL; if(pLPQ->pRear != NULL) {pLPQ->pRear->pNext = pNewLPQNode; } pLPQ->pRear = pNewLPQNode; if(pLPQ->pFront == NULL) {pLPQ->pFront = pNewLPQNode; } ++(pLPQ->nCount); return SUCCESS;}int LPQDelete(PLPQ pLPQ, EleType *et){ LPQNode *pIterator; int nMaxPriority; LPQNode *pMaxPriority, *pPrious, *pMaxPrious; if(pLPQ == NULL || IsLPQEmpty(pLPQ) || et == NULL) {return ERROR; } /* ** Find the Max Priority Node. */ /* Set the max-priority node pointer. */ pMaxPriority = pLPQ->pFront; /* Set the front of max-priority node pointer and prious pointer. */ pPrious = pMaxPrious = pLPQ->pFront; pIterator = pMaxPriority->pNext; /* Init the Max priority number. */ nMaxPriority = pMaxPriority->eleData.nPriority; while(pIterator != NULL) {if(nMaxPriority > pIterator->eleData.nPriority){ nMaxPriority = pIterator->eleData.nPriority; /* Save the Max-Priority node pointer. */ pMaxPriority = pIterator; /* Save the Prious pointer. */ pMaxPrious = pPrious;}pPrious = pIterator;pIterator = pIterator->pNext; } (*et).data = pMaxPriority->eleData.data; (*et).nPriority = pMaxPriority->eleData.nPriority; /* Check the pMaxPriority has changed. */ if(pMaxPriority != pLPQ->pFront) {/* pFront needn't changed. */pMaxPrious->pNext = pMaxPriority->pNext; } else {/* pFront changed. */pLPQ->pFront = pLPQ->pFront->pNext; } free(pMaxPriority); --(pLPQ->nCount); return SUCCESS;}int GetLPQ(PLPQ pLPQ, EleType *et){ LPQNode *pIterator; int nMaxPriority; LPQNode *pMaxPriority, *pPrious, *pMaxPrious; if(pLPQ == NULL || IsLPQEmpty(pLPQ) || et == NULL) {return ERROR; } /* Find the Max Priority Node. */ pMaxPriority = pLPQ->pFront; pPrious = pMaxPrious = pLPQ->pFront; pIterator = pMaxPriority->pNext; nMaxPriority = pLPQ->pFront->eleData.nPriority; while(pIterator != NULL) {if(nMaxPriority > pIterator->eleData.nPriority){ nMaxPriority = pIterator->eleData.nPriority; pMaxPriority = pIterator; pMaxPrious = pPrious;}pPrious = pIterator;pIterator = pIterator->pNext; } (*et).data = pMaxPriority->eleData.data; (*et).nPriority = pMaxPriority->eleData.nPriority; return SUCCESS;}void FreeLPQ(PLPQ *pLPQ){ LPQNode *pIterator, *pTemp; pIterator = (*pLPQ)->pFront; while(pIterator != NULL) {pTemp = pIterator;pIterator = pIterator->pNext;free(pTemp); } *pLPQ = NULL;}
测试程序:
#include <stdio.h>#include "LinkPriorityQueue.h"#define TEST_SIZE 10int main(int argc, char *argv[]){ EleType et; LinkPriorityQueue *pLPQ; int i = 0; InitLPQ(&pLPQ); printf("[Original]\nPriority Data\n"); printf("-------- ----\n"); for(i = 0; i < TEST_SIZE / 2; ++i) {et.data = i;et.nPriority = i;LPQAppend(pLPQ, et);printf("%5d%10d\n", et.nPriority, et.data); } for(i = TEST_SIZE / 2; i < TEST_SIZE; ++i) {et.data = i;et.nPriority = i % (TEST_SIZE / 2);printf("%5d%10d\n", et.nPriority, et.data);LPQAppend(pLPQ, et); } /* Get the Max Priority Data. */ GetLPQ(pLPQ, &et); printf("The max-priority is %d, data=%d.\n", et.nPriority, et.data); printf("Priority Data\n"); printf("-------- ----\n"); while(LPQDelete(pLPQ, &et) == SUCCESS) {printf("%5d%10d\n", et.nPriority, et.data); } FreeLPQ(&pLPQ); return 0;}
输出截图:
- LinkPriorityQueue——链式优先级队列
- (九)链式队列以及优先级队列应用
- LinkQueue——链式队列
- 队列——链式存储
- 数据结构——链式队列
- 优先级队列——PriorityQueue
- 队列——链式存储结构
- 数据结构——链式队列(c++)
- 链队列——链式存储结构
- 数据结构——队列之链式存储
- 第七周项目2—链式队列
- 一个作业调度程序,采用的链式优先级队列
- 链队列——队列的链式表示与实现
- 链队列——队列的链式表示和实现
- 单链队列——队列的链式存储结构
- C++——数据结构之 顺序队列 链式队列?
- SeqPriorityQueue——顺序优先级队列
- 堆排序2——优先级队列
- 用PowerBuilder制作指示灯
- Ext JS 4.1 RC1的修正错误
- 如何在PB中启动控制面板及其控制项
- 计算机体系结构(二)——码制
- PB中如何得到Crosstab中的列名
- LinkPriorityQueue——链式优先级队列
- 教你用电脑从 Google Play 下载 Android 程序 apk 文件
- 在PB应用中收发电子邮件
- PB中消息对话框的居中显示
- 【Android Training - 06】分享数据内容 [Lesson 1 - 发送分享的数据到其他App]
- 设计模式与实例代码:Strategy模式
- 用Android-X86和VirtualBox打造高性能Android開發環境
- IT人的学习方法论(全)
- cocoa多线程浅析