版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、實用標準文案數據結構實驗報告題目:利用哈夫曼編碼給文件或者文字加密班級:xxxx學號:xxxxxxxxxxx姓名:xxx完成時間:2010年12月19日任課教師:xxx一、 問題描述用哈夫曼編碼,將輸入的文字,或者文件中的文字進行編碼,并輸出加密后的文字。主程序main二、 程序總體結構顯示界面告訴用戶程序名稱show()給用戶提供選擇方式chioce1()顯示系統(tǒng)時間showtime()打開文件進行加密openfile()退出程序輸入電文進行加密input()統(tǒng)計輸入(文件中)字母的出現(xiàn)頻率CrW(data,w,count)【fcount(alldata,data,count)】將輸入(文件
2、中)的電文創(chuàng)建成哈夫曼樹CrtHuffmantree(ht,w,n)將輸入(文件中)的電文進行哈夫曼編碼CrtHuffmanCode(ht,hc,n)輸出每一個字母所對應的哈夫曼編碼Printf(hc,n,data,alldata,count)對輸入(文件中)的文字進行哈夫曼加密showall(hc,alldata,count,data,n)1、 數據結構此函數中運用到的數據結構知識就是哈夫曼樹的建立以及遍歷,建立主要就是每一次選擇權值最小的兩個數并將其求和,然后用他們的和代替這兩個數,再進行求兩個最小值,最后構成一個哈夫曼數;遍歷是采用從葉子結點開始向根節(jié)點確定唯一的路徑。2、 主要函數:(
3、1) void CrtHuffmantree(HuffmanTree &ht,int w,int n),功能是建立一個哈夫曼樹;(2) void CrtHuffmanCode(HuffmanTree ht,HuffmanCode hc,int n),功能是計算哈夫曼編碼;(3) void dianwen(int count,char alldata),功能是統(tǒng)計輸入電文的字母種類以及頻率;(4) int fcount(char alldata,char data,int count),功能是統(tǒng)計打開文件中出現(xiàn)的字母的種類以及頻率;(5) void showtime(),功能是查看系統(tǒng)當
4、前的時間;(6) int search(char ch,char data,int n),查詢電文中的每一個字母所對應得哈夫曼編碼的下標;(7) void Printf(HuffmanCode &hc,int n,char data,char alldata,int count),功能是輸出每一個字母所對應的哈夫曼編碼;(8) void showall(HuffmanCode hc,char alldata,int count,char data,int n),功能是輸出經過加密后的密文。三、 源代碼精彩文檔#include<stdio.h>#include<stdl
5、ib.h>#include<time.h>#include<string.h>#define N 27/定義最大葉子結點個數#define M 2*N-1typedef struct/定義哈夫曼結構體int weight;int parent;int LChild;int RChild;HTNode,HuffmanTreeM+1;/0號單元不用typedef char* HuffmanCodeN+1;/存儲哈夫曼編碼串的頭指針/調用系統(tǒng)的時間void showtime()time_t t;tm *tp; t=time(NULL);tp=localtime(&
6、;t); printf("nnttt%d/%d/%dn ",tp-> tm_mon+1,tp-> tm_mday,tp-> tm_year+1900);printf( "nttt %d:%d:%dn ",tp-> tm_hour,tp-> tm_min,tp-> tm_sec); /*計算電文中各個英文字母出現(xiàn)的次數*void dianwen(int count,char alldata)int n,i;printf("");printf("nnntttt請輸入電文:n");ff
7、lush(stdin);for(i=0;i<27;i+)/將數組計數器初始化 counti=0;printf("%c",7);alldata0=getchar();while(alldatacount0!='n')n=(alldatacount0-'a')+1;countn+;count0+;/所有字母的總個數alldatacount0=getchar();void CrW(char data,int w,int count)/存儲數據以及權值信息int i,j;j=0;for(i=1;i<=26;i+)if(counti!=0)
8、j+;dataj=char(i-1+'a');wj=counti;w0=j;/用于存儲字母出現(xiàn)的種類個數void select(HuffmanTree &ht,int n,int &s1,int &s2)/查找一串數字中的兩個最小值int i,t;s1=0;s2=0;ht0.weight=65535;for(i=1;i<=n;i+)if(hti.weight<hts1.weight&&hti.parent=0)t=s1;s1=i;if(htt.weight<hts2.weight)s2=t;else if(hti.wei
9、ght<hts2.weight&&hti.parent=0)s2=i;else;void CrtHuffmantree(HuffmanTree &ht,int w,int n)/創(chuàng)建哈夫曼樹int i,m;int s1,s2;for(i=1;i<=n;i+)/初始化葉子結點hti.weight=wi;hti.parent=0;hti.LChild=0;hti.RChild=0;m=2*n-1;for(i=n+1;i<=m;i+)/初始化其他結點hti.weight=0;hti.parent=0;hti.LChild=0;hti.RChild=0;for
10、(i=n+1;i<=m;i+)select(ht,i-1,s1,s2);hti.weight=hts1.weight+hts2.weight;hts1.parent=i;hts2.parent=i;hti.LChild=s1;hti.RChild=s2;/計算哈夫曼編碼void CrtHuffmanCode(HuffmanTree ht,HuffmanCode hc,int n)int i,start,c,p;char *cd;cd=(char *)malloc(n+1)*sizeof(char);cdn-1='0'for(i=1;i<=n;i+)start=n-1
11、;c=i;p=hti.parent;while(p!=0)-start;if(htp.LChild=c) cdstart='0'else cdstart='1'c=p;p=htp.parent;hci=(char *)malloc(n-start)*sizeof(char);strcpy(hci,&cdstart);free(cd);/查找字母所對應的哈夫曼編碼int search(char ch,char data,int n)int i;for(i=1;i<=n;i+)if(ch=datai)return i;else i+;return 1;
12、/顯示所有文字的哈夫曼編碼void showall(HuffmanCode hc,char alldata,int count,char data,int n)int i,m;system("cls");printf("nn");printf("ttt所有電文經過哈夫曼編碼加密之后如下n%c",7);printf("nn");for(i=0;i<count0;i+)m=search(alldatai,data,n);printf("%s",hcm);printf("nnn&quo
13、t;);system("pause");/輸出哈夫曼編碼void Printf(HuffmanCode &hc,int n,char data,char alldata,int count)int i;system("cls");printf("nn各個字母所對應的哈夫曼編碼nn%c",7);for(i=1;i<=n;i+)printf("t字母%c對應的哈夫曼碼為:",datai);puts(hci);printf("nn各個字母所對應的哈夫曼編碼nn");printf(&quo
14、t;nn 按任意鍵查看所有文字的加密結果nn");system("pause");showall(hc,alldata,count,data,n);/查看文字的加密結果/首界面窗口界面美化工作void show()int i;printf("nnn%c",7);for(i=0;i<30;i+)printf("%c=",2);printf("nnntt歡迎使用哈夫曼編碼加密系統(tǒng)nnn");for(i=0;i<30;i+)printf("%c=",2);printf("
15、;nntt ");system("pause");system("cls");/輸入文字加密void input()char alldata1000;int n,wN;/w用于存儲所出現(xiàn)的字母頻率,w0用于存儲出現(xiàn)字母種類的個數int count27;/用于存儲所有字母出現(xiàn)的頻率,count0用于存儲字母的總個數char dataN;/用于存儲所出現(xiàn)過的字母HuffmanTree ht;HuffmanCode hc;dianwen(count,alldata);CrW(data,w,count);n=w0;CrtHuffmantree(ht,w
16、,n);CrtHuffmanCode(ht,hc,n);Printf(hc,n,data,alldata,count);/計算文件中每一個字母出現(xiàn)的頻率int fcount(char alldata,char data,int count)int i=0,k=0,n,j;HuffmanTree ht;HuffmanCode hc;for(j=0;j<27;j+)countj=0;while(alldatai!='0')n=alldatai-'a'+1;countn+;/統(tǒng)計每一個字符出現(xiàn)的頻率datan=char(n-1+'a');coun
17、t0+;/統(tǒng)計文件中字母的總個數i+;for(j=0;j<27;j+)if(countj=0)k+;if(k!=0&&countj!=0)countj-k=countj;countj=0;k+;n=26-k;CrtHuffmantree(ht,count,n);CrtHuffmanCode(ht,hc,n);Printf(hc,n,data,alldata,count);return 0;/打開文件加密void openfile()FILE *fp;char alldata1000;int count27,i=0;char dataN;char stname20;for(
18、i=0;i<21;i+)printf("%c%c",1,2);printf("nnnt 請輸入文件名:%c",7);scanf("%s",&stname);if(fp=fopen(stname,"r")=NULL)printf("文件打開失??!n");exit(0);system("cls");printf("");printf("nntttt文件中的電文如下:nn%c",7);while(!feof(fp)fscanf(
19、fp,"%s",&alldata);printf("%snnn",alldata);printf("");printf("nntt 請按任意鍵查看電文中字母的哈夫曼編碼nnttt ");system("pause");fcount(alldata,data,count);if(fclose(fp)printf("不能關閉文件!n");exit(0);/提醒用戶的選擇1void chioce1()int n,i;printf("%c",7);for(
20、i=0;i<21;i+)printf("%c%c",1,2);printf("nnt 1、打開本地文件加密nt 2、輸入文字加密nt 0、退出nn");for(i=0;i<21;i+)printf("%c%c",1,2);printf("nnnt請輸入你的選擇:");scanf("%d",&n);while(n!=0&&n!=1&&n!=2)printf("%c",7);printf("nnn");pri
21、ntf(" 你的輸入有誤!請重新輸入!");printf("nnn");printf("nnt請輸入你的選擇:");scanf("%d",&n);system("cls");switch(n)case 1:openfile();break;case 2:input();break;case 0:printf("nnnnttt%c歡迎再次使用!再見nnn",7);return;/main函數int main()showtime();show();chioce1();re
22、turn 0;四、 測試及結果1、 測試情況這個程序中的創(chuàng)新之處就在于:(1)調用系統(tǒng)的時間;(2)將輸入的英文字母進行直接統(tǒng)計,節(jié)省了時間以及內存;(3)復習了文件的使用,可以從當地文件中打開電文進行加密;(4)打開文件后需要統(tǒng)計所出現(xiàn)的英文字母的種類以及頻率,需要根據字母所對應的ASCII碼直接存儲到相對應得位置(例如字母s,則它存儲位置的下標就應該是's'-'a'+1);(5)存儲完打開文件的信息之后,數組中可能出現(xiàn)0的情況(即電文中不出現(xiàn)某一個字母),需要在原來的數組上進行調整,并且要用時間、空間最小的方法,于是我變新設一個變量用于統(tǒng)計兩個出現(xiàn)過的字母之間的距離,然后進行移位【for(j=0;j<27;j+)if(countj=0)k+;if(k!=0&
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 貴陽職業(yè)技術學院《試驗設計與數據處理》2023-2024學年第一學期期末試卷
- 2025上海市安全員-C證考試(專職安全員)題庫附答案
- 2025江蘇省安全員《B證》考試題庫及答案
- 2025海南省建筑安全員C證考試(專職安全員)題庫附答案
- 廣州中醫(yī)藥大學《形體訓練(Ⅱ)》2023-2024學年第一學期期末試卷
- 廣州應用科技學院《環(huán)境藝術專題設計》2023-2024學年第一學期期末試卷
- 廣州現(xiàn)代信息工程職業(yè)技術學院《運動解剖學》2023-2024學年第一學期期末試卷
- 廣州鐵路職業(yè)技術學院《針織物設計與試織》2023-2024學年第一學期期末試卷
- 2025四川建筑安全員B證(項目經理)考試題庫
- 2025年福建建筑安全員《A證》考試題庫及答案
- 2024年股東股權繼承轉讓協(xié)議3篇
- 2025年中央歌劇院畢業(yè)生公開招聘11人歷年高頻重點提升(共500題)附帶答案詳解
- 北京市高校課件 開天辟地的大事變 中國近代史綱要 教學課件
- 監(jiān)事會年度工作計劃
- 2024年認證行業(yè)法律法規(guī)及認證基礎知識
- SVG無功補償培訓
- 新生兒聽力篩查技術規(guī)范衛(wèi)生部2010年版
- 大貓英語分級閱讀 六級1 Arthur's Fantastic Party課件
- SCA自動涂膠系統(tǒng)培訓講義
- LEC法取值標準對照表
- 華中數控車床編程及操作
評論
0/150
提交評論