哈夫曼編碼上機實驗報告_計算機軟件及應(yīng)用_IT計算機_第1頁
哈夫曼編碼上機實驗報告_計算機軟件及應(yīng)用_IT計算機_第2頁
哈夫曼編碼上機實驗報告_計算機軟件及應(yīng)用_IT計算機_第3頁
哈夫曼編碼上機實驗報告_計算機軟件及應(yīng)用_IT計算機_第4頁
哈夫曼編碼上機實驗報告_計算機軟件及應(yīng)用_IT計算機_第5頁
已閱讀5頁,還剩2頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、第四次上機實驗報告姓名:康輝班級:1518021一、 題目要求對輸入的一串電文字符(A B C D E F G H 8 個字符,其概率分別為 0.05, 0.29, 0.07, 0.08, 0.14, 0.23, 0.03, 0.11)實現(xiàn)Huffman編碼,再對Huffman編碼生成的代碼串進行譯碼,輸出電文字符串。實現(xiàn)功能如下: Huffman樹的建立 Huffman編碼的生成 編碼文件的譯碼二、 程序思路設(shè)置一個數(shù)組v存放待編碼元素,一個數(shù)組w存放權(quán)值,n為元素個數(shù),ht為創(chuàng)立的哈夫曼樹,hc為指針數(shù)組存儲哈夫曼編碼,這些作為函數(shù)參數(shù)傳遞到函數(shù)haffcoding中,創(chuàng)立編碼樹,然后按權(quán)

2、值進行編碼,這些都在一個函數(shù)中實現(xiàn)。哈夫曼樹節(jié)點:typedef structchar data;Int weight;Int parent,lchild,rchild;htnode,huffmantree;三、 程序設(shè)計中遇到的問題1、 選擇一個數(shù)組來存儲來存放編碼,但是指針數(shù)組運用的不夠熟練,造成值傳遞時出錯。最后查看c語言書籍得以解決.2、 在選擇所有權(quán)值中最小,次小的時候出現(xiàn)錯誤,造成亂序,編出來的編碼不正確,最后通過單步調(diào)試找出錯誤。3、 hc=(huffmancode)malloc(n+1)*sizeof(char *);這里第一次分配空間為char型,對指針數(shù)組很不熟悉造成的。4

3、、 還有其他的很多問題在程序中都有注釋加重點。四、 程序源碼#include <stdio.h>#include <stdlib.h>#include<string.h>#define length sizeof(htnode)typedef struct htnodechar data;int weight;int parent,lchild,rchild;htnode,*huffmantree;/哈夫曼存儲結(jié)構(gòu) typedef char *huffmancode;/存儲哈夫曼編碼表void huffmancoding(huffmantree ht,huf

4、fmancode &hc,int *w,char *v,int n)/v是待編碼元素數(shù)組,w是每個元素的權(quán)值,構(gòu)造哈夫曼樹ht,hc存放哈夫曼編碼 int i,m,s1,s2,min1,min2,j;char *cd;int start,c,f;if(n<=1) return;m=2*n-1;ht=(huffmantree)malloc(m+1)*length);/有n個葉子節(jié)點的hfuumantree需要2n-1個結(jié)點存儲 for(i=1;i<=n;+i,+w,+v)/對n個元素進賦值,權(quán)值,父親左右孩子標記為0 hti.data=*v;hti.weight=*w;hti

5、.lchild=0;hti.parent=0;hti.rchild=0; for(;i<=m;+i)/對后m-n個非葉子節(jié)點標記 hti.data=0;hti.weight=0;hti.lchild=0;hti.parent=0;hti.rchild=0 ;for(i=n+1;i<=m;+i)/建樹 s1=s2=0;min1=min2=32767; for(j=1;j<=i-1;+j) if(htj.parent=0)if(htj.weight<min1)min2=min1;min1=htj.weight;s2=s1;s1=j;/此第一次處排序出錯 else if(ht

6、j.weight<min2)min2=htj.weight;s2=j; hts1.parent=i;hts2.parent=i; hti.lchild=s1;hti.rchild=s2; hti.weight=min1+min2; /一下為從葉子結(jié)點到根節(jié)點求哈夫曼編碼 hc=(huffmancode)malloc(n+1)*sizeof(char *);/分配n個字符編碼的頭指針向量 cd=(char*)malloc(n*sizeof(char); /分配求編碼的工作空間 cdn-1='0'for(i=1;i<=n;+i)start=n-1;for(c=i,f=h

7、ti.parent;f!=0;c=f,f=htf.parent)/葉子到根if(htf.lchild=c) /=cd-start='0'elsecd-start='1' hci=(char *)malloc(n-start)*sizeof(char);/為第i個字符編碼分配空間strcpy(hci,cd+start); free(cd); /huffmancodingint main()printf("*哈夫曼編碼* by-KangHuin");int n,i;char *v;/存字符 int *w;/權(quán)值 huffmantree ht;hu

8、ffmancode hc;printf("請輸入需要編碼元素的個數(shù):");scanf("%d",&n);printf("請輸入要編碼的字符串(連續(xù)輸入不要有空格:)") ;v=(char *)malloc(n+2)*sizeof(char) ;vn+1='0'scanf("%s",v);w=(int *)malloc(n+1)*sizeof(int);printf("請輸入每個字符的權(quán)值(空格隔開):");for(i=0;i<n;+i)/i=1錯誤,可能會造成傳輸過去形參空執(zhí)政scanf("%d",w+i); huffmancoding(ht,hc,w,v,n);printf("各個字符哈夫曼編碼分別為:");for(i=1;i<=n;i+)printf("%s ",hci); /這里竟然他媽一直用的ht,讓我找了那么久= =printf("n");return 0;運行截圖:五、 編程總結(jié)最大的感受就是單步調(diào)試在程序修改中的重要性,以前寫的程序都比擬少,有錯誤直接就可以看出來,現(xiàn)在程序比擬長,不易

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論