




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、設(shè)計(jì)一個(gè)利用哈夫曼算法的編碼系統(tǒng),重復(fù)地顯示并處理以下項(xiàng)目,直到選擇退出為止。【基本要求】1) 將權(quán)值數(shù)據(jù)存放在數(shù)據(jù)文件(文件名為data.txt,位于執(zhí)行程序的當(dāng)前目錄中)2) 初始化:鍵盤輸入字符集大小n、n個(gè)字符和n個(gè)權(quán)值,建立哈夫曼樹;3) 編碼:利用建好的哈夫曼樹生成哈夫曼編碼;4) 輸出(1)各個(gè)字
2、符的編碼;(2)1111111;#include<stdio.h>#include<string.h>#include<malloc.h>#define M 50#define MAX 1000;typedef struct int weight;/結(jié)點(diǎn)權(quán)值 int parent,lchild,rchild;HTNODE,*HUFFMANTREE;typedef char* HUFFMANCODE;/動(dòng)態(tài)分配數(shù)組存儲(chǔ)哈夫曼編碼表HUFFMANTREE huffmantree(int n,int weight)/構(gòu)
3、建哈夫曼樹 int m1,m2,k; int i,j,x1,x2; HUFFMANTREE ht; ht=(HUFFMANTREE)malloc(2*n)*sizeof(HTNODE); for(i=1;i<(2*n);i+)/初始化哈夫曼樹中各結(jié)點(diǎn)的數(shù)據(jù),沒初始值的賦值為0 hti.parent=hti.lchild=hti.rchild=0; if(i<=n) hti.weight=weighti; else
4、; hti.weight=0; for(i=1;i<n;i+)/每一重循環(huán)從森林中選擇最小的兩棵樹組建成一顆新樹 m1=m2=MAX; x1=x2=0; for(j=1;j<(n+i);j+) if(htj.weight<m1)&&(htj.parent=0) m2=m1;
5、60; x2=x1; m1=htj.weight; x1=j; else if(htj.weight<m2)&&(htj.parent=0) m2=htj.weight; x2=j; k=n+i;
6、 htx1.parent=htx2.parent=k; htk.weight=m1+m2; htk.lchild=x1; htk.rchild=x2; return ht;void huffmancoding(const int n,HUFFMANCODE hc,HUFFMANTREE ht,char str) int i,start,child,father; char *cd; hc=(HUFFMANCODE)malloc(n+1)*sizeof(ch
7、ar*);/分配n個(gè)字符編碼的頭指針 cd=(char*)malloc(n*sizeof(char);/分配求編碼的工作空間 cdn-1='0'/編碼結(jié)束符 for(i=1;i<=n;+i)/逐個(gè)字符求哈夫曼編碼 start=n-1; for(child=i,father=hti.parent;father!=0;child=father,father=htfather.parent)/*從葉子結(jié)點(diǎn)到根結(jié)點(diǎn)求逆向編碼*/ if(htfather.lchi
8、ld=child) cd-start='0' else cd-start='1' hci=(char*)malloc(n-start)*sizeof(char);/為i個(gè)字符編碼分配空間 strcpy(hci,&cdstart);/從cd復(fù)制哈夫曼編碼串到hc free(cd);/釋放工作空間 for(i=1;i<=n;+i)
9、 printf("%c的編碼:",stri); printf("%sn",hci); void main() int i,j,k; char str50; int weight50; printf("請(qǐng)輸入字符(一次性連續(xù)輸入所求的字符):");/*如:abcjhjg不要輸成ab cj hig,即字符間不加空格*/ gets(str); for(j=0;j<50;j+)
10、; if(strj='0') break; const int n=j; for(j=n;j>0;j-) strj=strj-1; strn+1='0' for(k=0;k<n;k+) printf("請(qǐng)輸入%c的權(quán)值:",strk+1); scanf("%d",&weightk);
11、 for(k=n;k>0;k-) weightk=weightk-1; weight0=0; HUFFMANCODE hc=NULL; HUFFMANTREE ht; ht=huffmantree(n,weight); huffmancoding(n,hc,ht,str); 補(bǔ)充:噢,我忘了你需要存檔。現(xiàn)在太晚,明天再改一下。 補(bǔ)充:這個(gè)是帶有存盤的程序。#include<stdio.h>#include<string.h>#include<malloc.h
12、>#define M 50#define MAX 1000;typedef int Elempe;typedef struct int weight;/結(jié)點(diǎn)權(quán)值 int parent,lchild,rchild;HTNODE,*HUFFMANTREE;typedef char* HUFFMANCODE;/動(dòng)態(tài)分配數(shù)組存儲(chǔ)哈夫曼編碼表HUFFMANTREE huffmantree(int n,int weight)/構(gòu)建哈夫曼樹 int m1,m2,k; int i,j,x1,x2; HUFFMANTREE ht;
13、 ht=(HUFFMANTREE)malloc(2*n)*sizeof(HTNODE); for(i=1;i<(2*n);i+)/初始化哈夫曼樹中各結(jié)點(diǎn)的數(shù)據(jù),沒初始值的賦值為0 hti.parent=hti.lchild=hti.rchild=0; if(i<=n) hti.weight=weighti; else hti.weight=0; for(i=1;i<n;i+)/每一重循環(huán)從森
14、林中選擇最小的兩棵樹組建成一顆新樹 m1=m2=MAX; x1=x2=0; for(j=1;j<(n+i);j+) if(htj.weight<m1)&&(htj.parent=0) m2=m1; x2=x1; m1=htj.weight;
15、; x1=j; else if(htj.weight<m2)&&(htj.parent=0) m2=htj.weight; x2=j; k=n+i; htx1.parent=htx2.parent=k; htk.weight=m1+
16、m2; htk.lchild=x1; htk.rchild=x2; return ht;void huffmancoding(const int n,HUFFMANCODE hc,HUFFMANTREE ht,char str) int i,start,child,father; char *cd; hc=(HUFFMANCODE)malloc(n+1)*sizeof(char*);/分配n個(gè)字符編碼的頭指針 cd=(char*)malloc(n*sizeof(char);/分配求編碼的工
17、作空間 cdn-1='0'/編碼結(jié)束符 for(i=1;i<=n;+i)/逐個(gè)字符求哈夫曼編碼 start=n-1; for(child=i,father=hti.parent;father!=0;child=father,father=htfather.parent)/*從葉子結(jié)點(diǎn)到根結(jié)點(diǎn)求逆向編碼*/ if(htfather.lchild=child) cd-start='0'
18、; else cd-start='1' hci=(char*)malloc(n-start)*sizeof(char);/為i個(gè)字符編碼分配空間 strcpy(hci,&cdstart);/從cd復(fù)制哈夫曼編碼串到hc free(cd);/釋放工作空間 for(i=1;i<=n;+i) printf("%c的編碼:",stri); pr
19、intf("%sn",hci); void Save(int a,const int& n) FILE *fp; int i,count=0,flag=1; fp=fopen("data.txt","wb+"); for(i=1;i<=n;i+) if(fwrite(&ai,sizeof(1),1,fp)=1) count+;
20、 else flag=0; printf("數(shù)據(jù)保存失敗!n"); break; if(flag) printf("n數(shù)據(jù)保存成功!(有%d個(gè)權(quán)值已保存)n",count); fclose(fp);void main() FILE fp; int i,j,k; char str50; int weight
21、50; printf("請(qǐng)輸入字符(一次性連續(xù)輸入所求的字符):");/*如:abcjhjg不要輸成ab cj hig,即字符間不加空格*/ gets(str); for(j=0;j<50;j+) if(strj='0') break; const int n=j; for(j=n;j>0;j-) strj=strj-1; strn+1='0'&
22、#160;for(k=0;k<n;k+) printf("請(qǐng)輸入%c的權(quán)值:",strk+1); scanf("%d",&weightk); for(k=n;k>0;k-) weightk=weightk-1; weight0=0; HUFFMANCODE hc=NULL; HUFFMANTREE ht; ht=huffmantree(n,weight); hu
23、ffmancoding(n,hc,ht,str); Save(weight,n);2222222222;#include<stdio.h>#include<stdlib.h>#define max 50 struct a int weight; int parent,lchild,rchild; struct b char cdmax; int start; void main()
24、160; struct a ht2*max; struct b hcdmax,d; int i,k,n,c,s1,s2,m1,m2,f; printf("輸入n:"); scanf("%d",&n); for(i=1;i<=n;i+) printf("輸入權(quán)值:"); scanf("%d&q
25、uot;,&hti.weight); hti.parent=0; for(;i<=2*n-1;i+) hti.parent=hti.lchild=hti.rchild=0; for(i=n+1;i<=2*n-1;i+) m1=m2=30000; s1=s2=0; for(k=1;k<=i-1;k+)
26、 if(htk.parent=0 && htk.weight<m1) m2=m1; s2=s1; m1=htk.weight; s1=k; else if(htk.parent=0 && htk.weight<m2) m2=htk.weight; s2=k;
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 細(xì)菌分類基礎(chǔ)試題及答案
- 2025年注會(huì)經(jīng)濟(jì)法核心試題及答案
- 2025年注冊(cè)會(huì)計(jì)師復(fù)習(xí)側(cè)重點(diǎn)與方法指導(dǎo)試題及答案
- 2024年行政管理師考試策略分析的試題及答案
- 2024年項(xiàng)目管理考試的心態(tài)調(diào)整試題及答案
- 2025年證券從業(yè)考試指導(dǎo)試題及答案
- 視頻設(shè)計(jì)執(zhí)行方案范本
- 衛(wèi)生委考試面試題及答案
- 微生物檢驗(yàn)技師證書考試試題及答案探究
- 稀土金屬加工質(zhì)量改進(jìn)工具應(yīng)用案例考核試卷
- 離職體檢免責(zé)協(xié)議書
- 光電工程師需掌握的常用計(jì)算試題及答案
- 煙草證借用合同范本
- 燒燙傷培訓(xùn)課件
- 3D打印在康復(fù)輔具中的應(yīng)用-全面剖析
- 縣級(jí)安全生產(chǎn)大講堂課件
- 北京市門頭溝區(qū)2025屆高三一模考試生物試題(原卷版+解析版)
- 有限合伙制私募股權(quán)基金整體框架圖解及案例
- 大部分分校:地域文化形考任務(wù)一-國(guó)開(CQ)-國(guó)開期末復(fù)習(xí)資料
- 2025年慢性阻塞性肺疾病全球創(chuàng)議GOLD指南修訂解讀課件
- 小學(xué)五年級(jí)家長(zhǎng)會(huì)-主題班會(huì)
評(píng)論
0/150
提交評(píng)論