数据结构实习之Huffman编译码器(三)

来源:互联网 发布:zph01单片机驱动程序 编辑:程序博客网 时间:2024/05/21 17:02

3.对每个字符编码:

void HuffanTree::enCode(int n,CListCtrl *list)//huffman coding{HuffmanNode *current;HuffmanNode *parent;CString code="";//编码int charNum,nodeNum;char ch;for(charNum=0;charNum<n;charNum++){code="";ch= list->GetItemText(charNum,0)[0];for(nodeNum=0;nodeNum<n;nodeNum++){if (ch==huffNode[nodeNum]->character){current=huffNode[nodeNum]->sAddress;parent=current->parent;while(current!=root){if (parent!=NULL&&parent->rightChild->sAddress==current->sAddress)code+="1";if (parent!=NULL&&parent->leftChild->sAddress==current->sAddress)code+="0";current=parent;parent=current->parent;}code.MakeReverse();huffNode[nodeNum]->hfmCode=code;//将code逆序}}list->SetItemText(charNum,3,code);}}


4.对字符串编译码

void CHuffmanDlg::OnButtonDecode() {// TODO: Add your control notification handler code hereCString codeStr,str,strTemp,strTemp2;CString decodeStr="";GetDlgItemText(IDC_EDIT_CODE,codeStr);str=codeStr;int n=m_num;//叶子节点个数int i=0,j=0;int minLC=m_plist.GetItemText(0,3).GetLength(),maxLC=0;//最短和最长哈弗曼码int len=0;for (i=0;i<n;i++){len=m_plist.GetItemText(i,3).GetLength();minLC=minLC<=len?minLC:len;maxLC=maxLC>=len?maxLC:len;}while(str!=""){for (i=minLC;i<=maxLC;i++){strTemp=str.Left(i);j=0;strTemp2=m_plist.GetItemText(j,3);while(strTemp!=strTemp2&&j<n){j++;strTemp2=m_plist.GetItemText(j,3);}if (strTemp==m_plist.GetItemText(j,3)&&j<n){str=str.Right(str.GetLength()-i);decodeStr+=m_plist.GetItemText(j,0);}}}SetDlgItemText(IDC_EDIT_DECODE,decodeStr);}


 

 

原创粉丝点击