1. 程式人生 > >利用優先佇列編寫哈夫曼樹和編碼

利用優先佇列編寫哈夫曼樹和編碼

利用“有序連結串列”來實現優先佇列,連結串列元素按優先順序遞減。元素出列即出首元素,元素入列即將元素插入有序連結串列使其依然有序。本程式中,字元頻率小則優先順序高。

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;
}

這裡只是優先佇列的程式碼,哈夫曼樹和編碼的下一篇分享!!!