哈夫曼解碼
1000(ms)
10000(kb)
1974 / 4142
通常要求根據給定的編碼本對密文進行解碼。現已給定相應字元的哈夫曼編碼,要求根據編碼對密文進行解碼。(建立哈夫曼樹以及編碼、主函式等都已經給出,你只需要填寫解碼函式void ccode(haffnode hafftree,int n)即可。
const int maxvalue=100;
const int maxbit=100;
const int maxn=100;
#include "iostream"
#include "stdio.h"
#include "stdlib.h"
using namespace std;
struct haffnode
char ch;
int weight;
int flag;
int parent;
int leftchild;
int rightchild;
struct code
int bit[maxn];
int start;
int weight;
char ch;
void haffman(int weight,char text,int n,haffnode hafftree)
int j,m1,m2,x1,x2,i;
for(i=0;i< 2*n-1;i++)
if(i < n)
hafftree[i].weight=weight[i];
hafftree[i].
ch=text[i];
else
hafftree[i].weight=0;
hafftree[i].ch='#';
hafftree[i].parent=0;
hafftree[i].flag=0;
hafftree[i].leftchild=-1;
hafftree[i].rightchild=-1;
for(i=0;i< n-1;i++)
m1=m2=maxvalue;
x1=x2=0;
for(j=0;j< n+i;j++)
if(hafftree[j].weight< m1&&hafftree[j].flag==0)
m2=m1;
x2=x1;
m1=hafftree[j].weight;
x1=j;
else if(hafftree[j].weight< m2&&hafftree[j].flag==0)
m2=hafftree[j].weight; x2=j;
hafftree[x1].parent=n+i;
hafftree[x2].parent=n+i;
hafftree[x1].flag=1;
hafftree[x2].flag=1;
hafftree[n+i].weight=hafftree[x1].weight+hafftree[x2].weight;
hafftree[n+i].leftchild=x1; hafftree[n+i].rightchild=x2;
void haffmancode(haffnode hafftree,int n,code haffcode)
code cd; int i,j; int child,parent;
for( i=0;i< n;i++)
cd.start=n-1;
cd.weight=hafftree[i].weight;
cd.ch=hafftree[i].ch;
child=i;
parent=hafftree[child].parent;
while(parent!=0)
if(hafftree[parent].leftchild==child)
cd.bit[cd.start]=0;
else cd.bit[cd.start]=1;
cd.start--;
child=parent;
parent=hafftree[child].parent;
for(j=cd.start+1;j< n;j++)
haffcode[i].bit[j]=cd.bit[j];
haffcode[i].start=cd.start;
haffcode[i].weight=cd.weight;
haffcode[i].ch=cd.ch;
void ccode(haffnode hafftree,int n)
int main( )
int n=8;
int weight=;
char text=;
haffnode myhafftree[maxvalue];
code myhaffcode[maxvalue];
haffman(weight,text,n,myhafftree);
haffmancode(myhafftree,n,myhaffcode);
ccode(myhafftree,n);
return 0;
輸入
根據哈夫曼樹編碼表,針對字串做好的編碼結果。
輸出
對每一行需要解碼的串,進行解碼,並輸出解碼後的結果。
樣例輸入
000100011011101110
樣例輸出
aabcc
#include#include#includeusing namespace std;
const int maxvalue=100;
const int maxbit=100;
const int maxn=100;
struct haffnode
;struct code
; void haffman(int weight,char text,int n,haffnode hafftree)//樹的生成
else//將到2n-2依次設定權重為0,字元為#
hafftree[i].parent=0;//初始化雙親結點
hafftree[i].flag=0;//初始化標記
hafftree[i].leftchild=-1;//初始化左孩子
hafftree[i].rightchild=-1;//初始化右孩子
} for(i=0;i< n-1;i++)
else if(hafftree[j].weight< m2&&hafftree[j].flag==0)//如果該結點的權重小於m2,並且未標記使用過,則將其權重以及序號賦值給m2,x2
} hafftree[x1].parent=n+i;//最小結點的雙親賦值
hafftree[x2].parent=n+i;//第2小結點的雙親賦值
hafftree[x1].flag=1; //標記最小以及第二小結點為已經使用過
hafftree[x2].flag=1;
hafftree[n+i].weight=hafftree[x1].weight+hafftree[x2].weight;//該結點為剛剛找到的最小結點以及第二小結點的雙親,其權重為左右孩子權重的和
hafftree[n+i].leftchild=x1;
hafftree[n+i].rightchild=x2;
} } void haffmancode(haffnode hafftree,int n,code haffcode)//編碼 忽略!
for(j=cd.start+1;j< n;j++)
haffcode[i].bit[j]=cd.bit[j];
haffcode[i].start=cd.start;
haffcode[i].weight=cd.weight;
haffcode[i].ch=cd.ch;
} } void ccode(haffnode hafftree,int n)//翻譯解碼 }}
int main( )
; char text=;
haffnode myhafftree[maxvalue];
code myhaffcode[maxvalue];
haffman(weight,text,n,myhafftree);
haffmancode(myhafftree,n,myhaffcode);
ccode(myhafftree,n);
return 0;
}
西南科技大學OJ題 迴圈佇列0965
迴圈佇列 根據給定的空間構造順序迴圈佇列,規定隊滿處理方法為少用乙個元素空間。例如,給定5個元素空間構造迴圈佇列,則只能存放4個元素。試根據入隊及出隊操作判斷佇列最後的元素存放情況,並輸出最後佇列中的元素值,即完成給定入隊及出列操作後一次性全部出隊的元素值。要求採用順序佇列完成,少用乙個儲存空間的方...
西南科技大學OJ題 逆置單鏈表0957
逆置單鏈表 建立長度為n的單鏈表,然後將其資料元素逆置,即第1個元素變為最後乙個元素,第2個元素變為倒數第2個元素,以此類推,最後乙個元素變為第1個元素。處理的資料型別為字元型。必須使用鍊錶完成。輸入第一行為鍊錶長度n 第二行為鍊錶中的n個資料元素的值。輸出 逆置後的原始的值。樣例輸入 10 abc...
西南科技大學OJ題 雙向鍊錶的操作問題0960
雙向鍊錶的操作問題 建立乙個長度為n的帶頭結點的雙向鍊錶,使得該鍊錶中的資料元素遞增有序排列。必須使用雙向鍊錶完成,資料型別為整型。輸入第一行 雙向表的長度 第二行 鍊錶中的資料元素。輸出 輸出雙向鍊錶中的資料元素的值。樣例輸入 10 2 4 6 3 5 8 10 21 12 9樣例輸出 2 3 4...