西南科技大學OJ題 哈夫曼解碼0986

2021-09-13 13:41:16 字數 4337 閱讀 5343

哈夫曼解碼

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...