第一篇:數(shù)據(jù)結(jié)構(gòu)課程設(shè)計
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計
1.赫夫曼編碼器
設(shè)計一個利用赫夫曼算法的編碼和譯碼系統(tǒng),重復(fù)地顯示并處理以下項目,直到選擇退出為止。要求:
1)將權(quán)值數(shù)據(jù)存放在數(shù)據(jù)文件(文件名為data.txt,位于執(zhí)行程序的當前目錄中)
2)初始化:鍵盤輸入字符集大小26、26個字符和26個權(quán)值(統(tǒng)計一篇英文文章中26個字母),建立哈夫曼樹;
3)編碼:利用建好的哈夫曼樹生成哈夫曼編碼;
4)輸出編碼(首先實現(xiàn)屏幕輸出,然后實現(xiàn)文件輸出); 5)界面優(yōu)化設(shè)計。
代碼如下:
#include
typedef struct HTNode
//結(jié)構(gòu)體 { int Weight;
char ch;int Parent,Lchild,Rchild;}HTNode;typedef char * * HCode;
void Save(int n,HTNode *HT)
//把權(quán)值保存到文件 {
FILE * fp;
int i;
if((fp=fopen(“data.txt”,“wb”))==NULL)
{
printf(“cannot open filen”);
return;
}
for(i=0;i if(fwrite(&HT[i].Weight,sizeof(struct HTNode),1,fp)!=1) printf(“file write errorn”); fclose(fp); system(“cls”); printf(“保存成功!”); } void Create_H(int n,int m,HTNode *HT) //建立赫夫曼樹,進行編碼 { int w,k,j;char c;for(k=1;k<=m;k++){ if(k<=n) { printf(“n請輸入權(quán)值和字符(用空格隔開): ”); scanf(“%d”,&w); scanf(“ %c”,&c);HT[k].ch=c; HT[k].Weight=w; } else HT[k].Weight=0; HT[k].Parent=HT[k].Lchild=HT[k].Rchild=0;} int p1,p2,w1,w2; for(k=n+1;k<=m;k++){ p1=0;p2=0; w1=32767;w2=32767; for(j=1;j<=k-1;j++) { if(HT[j].Parent==0) { if(HT[j].Weight { w2=w1;p2=p1; w1=HT[j].Weight; p1=j; } else if(HT[j].Weight { w2=HT[j].Weight; p2=j; } } } HT[k].Lchild=p1;HT[k].Rchild=p2;HT[k].Weight=HT[p1].Weight+HT[p2].Weight; HT[p1].Parent=k;HT[p2].Parent=k; } printf(“輸入成功!”);} void Coding_H(int n,HTNode *HT) //對結(jié)點進行譯碼 { int k,sp,fp,p;char *cd;HCode HC; HC=(HCode)malloc((n+1)*sizeof(char *)); cd=(char *)malloc(n*sizeof(char));cd[n-1]='