利用優先佇列編寫哈夫曼樹和編碼
阿新 • • 發佈:2019-02-01
利用“有序連結串列”來實現優先佇列,連結串列元素按優先順序遞減。元素出列即出首元素,元素入列即將元素插入有序連結串列使其依然有序。本程式中,字元頻率小則優先順序高。
typedef int PQElemType;//後期需要改回HuffmanTree型別 //"優先連結串列"基於(有序)連結串列LinkList typedef struct PQNode { PQElemType data; PQNode *next; }*LinkList; // 定義“優先佇列”型別PQueue typedef struct { LinkList h; //連結串列的頭結點 int len; //長度也“封裝”其中 // bool (*Gt)(PQElemType,PQElemType); }PQueue;
#include<iostream> #include<stdio.h> #include <stdlib.h> #include"priorityQueue.h" using namespace std; ///將資料讀入pq void ReadToPQueue(PQueue &pq) { PQElemType e; pq.h = new PQNode; pq.h->next=NULL; pq.len=0; while(cin>>e && e!='0') { PQNode *pqNew=new PQNode; pqNew->data = e; pqNew->next = pq.h->next; pq.h->next = pqNew; pq.len++; cout << pq.h->next->data << " "; } return ; } /// 建立鏈式優先佇列,實為排序 void BuildPQueue(PQueue &pq) { PQueue pqNew; PQElemType m; pqNew.h = new PQNode; pqNew.h->next=NULL; pq.h = pq.h->next; while (pq.h) { Push(pqNew,pq.h->data); pq.h = pq.h->next; } pq = pqNew; return ; } /// 優先佇列判空 bool IsEmpty(PQueue pq) { if(pq.h==NULL) return true; return false; } ///將元素插入優先順序佇列(就是將元素插入有序連結串列,使其依然有序) void Push(PQueue &pq, PQElemType elem) { PQNode *sq; PQNode *LNew=new PQNode; LNew->data = elem; LNew->next = NULL; for (sq = pq.h ; sq->next&& sq->next->data-LNew->data<0; sq = sq->next) ; LNew->next = sq->next; sq->next = LNew; } /// 從優先佇列中刪除並返回元素(就是刪除連結串列第一個結點) PQElemType Pop(PQueue &pq) { if(pq.h == NULL) return -1; PQNode *pqNew = new PQNode; pqNew = pq.h->next; pq.h->next = pqNew->next; return pqNew->data; }
這裡只是優先佇列的程式碼,哈夫曼樹和編碼的下一篇分享!!!