利用优先队列编写哈夫曼树和编码

    利用“有序链表”来实现优先队列,链表元素按优先级递减。元素出列即出首元素,元素入列即将元素插入有序链表使其依然有序。本程序中,字符频率小则优先级高。

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

这里只是优先队列的代码,哈夫曼树和编码的下一篇分享!!!

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值