資源簡介
實驗內容要求:
1、對某篇500單詞左右的英文文本文件中字母、標點符號的使用頻率進行統計,然后對出現的字母和標點符號進行哈夫曼編碼。
2、要求英文文本采用文件方式讀取,輸出結果中要分別列出各字符(包括字母和標點符號)的出現頻率和哈夫曼編碼。
代碼片段和文件信息
#include?
#include?
#include?
#include?
#define?M?10000????//定義字符串最大長度
#define?N?128????????//定義葉子節點個數
typedef?struct?node??????????????//定義赫夫曼樹節點結構體
{
????int?weight;
????struct?node?*LChild*RChild*Parent;?//分別指向該節點的左孩子右孩子和雙親節點
????struct?node?*next;????????????????????//指向建立的赫夫曼樹的下一個節點
}?HFMNode*HFMTree;
typedef?struct???????????????????//定義赫夫曼編碼的結構體
{
????char?ch;??????????????????????//存儲對應的字符
????char?code[N+1];????????????????//存儲對應字符的編碼
????int?start;?????????????????????//存儲編碼的起始位置
}?CodeNode;
int?n;???????????????//存儲真正葉子節點個數
void?clearscreen()
{
????system(“cls“);
}
void?Open(char?s[])?????????????//打開存放字符或編碼的文件將其存入字符串數組中
{
????FILE?*fp;
????char?name[10];
????int?i=0;
????printf(“請輸入要打開的文件名(加后綴名)“);
????gets(name);
????printf(“%s“name);?????????????????????//要打開的文件名
????fp=fopen(“name““rt“);
????if(fp==NULL)
????{
????????printf(“打開失敗\n“);?????????????//若打開失敗則直接退出
????????getch();
????????exit(0);
????}
?????printf(“打開成功\n“);
????s[i++]=fgetc(fp);
????while(s[i-1]!=EOF)
????????s[i++]=fgetc(fp);
????s[i]=‘\0‘;???????????????????????????//存取字符串結束
????fclose(fp);
}
void?Save(char?s[])????????????????????????//保存字符或編碼到文件中
{
????char?name[10];
????FILE?*fp;
????printf(“請輸入要保存的文件名(加后綴名)“);
????gets(name);
????if((fp=fopen(name“wt“))==NULL)
????{
????????printf(“存儲失敗“);
????????exit(1);
????}
????fputs(sfp);
????printf(“\n保存成功文件名為:%s。\n“name);
????printf(“\n按回車鍵繼續...“);
????getchar();
????fclose(fp);
}
void?SearchStr(char?s[]char?str[]int?count[])
{
????//查找字符串中字符的個數和每個字符出現的次數
????int?ijk=0;
????for(i=0;?i ????????count[i]=0;
????for(i=0;?s[i];?i++)
????{
????????for(j=0;?j ????????????if(str[j]==s[i])
????????????{
????????????????count[j]++;
????????????????break;
????????????}
????????if(j==k)?????????????????????//在str[]中無該字符將其存入最后一個單元
????????{
????????????str[k]=s[i];
????????????count[k++]++;
????????}
????}
????str[k]=‘\0‘;??????????????????//將字符串結尾置\0
????n=k;????????????????????????????//將實際的字符個數作為葉子節點個數存入n
}
void?SelectMin(HFMTree?HTint?kHFMTree?*HT1HFMTree?*HT2)
{
????//查找赫夫曼鏈表中兩個權值最小的節點
????int?imin;
????HFMTree?p;
????min=32767;
????for(i=0p=HT;?inext)
????????if(p->weightParent==0)
????????{
????????????min=p->weight;
????????????*HT1=p;
????????}
????min=32767;
????for(i=0p=HT;?inext)
????????if(p->weightParent==0&&p!=*HT1)?//令第二個最小的節點不等于第一個節點
????????{
????????????min=p->weight;
????????????*HT2=p;
????????}
}
void?CreatHFMTree(HFMTree?*HTint?count[])
{
//創建赫夫曼樹
????int?i;
????HFMTree?pHT1HT2;???//HT1HT2分別存放權值最小和次小的節點的位置
????p=*HT=(HFMTree)malloc(sizeof(HFMNode));
????p->next=p->LChild=p->RChild=p->Parent=NULL;?//初始化赫夫曼鏈表且有2n-1個節點
????for(i=1;?i<2*n-1;?i++)
????{
????????p->next=(HFMTree)malloc(sizeof(HFMNode));
????????p=p->next;
??
- 上一篇:文件系統的用戶界面[含答案]
- 下一篇:C++大富翁代碼
評論
共有 條評論