资源简介
实验内容要求:
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++大富翁代码
相关资源
- 用C语言实现ARC圆弧插补计算
- 基于TMS320VC5416的DTMF双音多频发生与检
- 阅览室问题C语言实现
- c++ c 数据结构 课程设计 学生成绩管理
- C语言编写的高精度求积分函数
- 使用c语言实现图像二值化
- c语言实现的自动贩卖机程序
- 人事管理系统C语言课程设计报告
- C语言 马踏棋盘 完整代码及实验报告
- C语言 图书馆借阅管理系统 完整代码
- UDP协议客户端服务器间视频传输c源码
- 基于51单片机的c语言编写的计算器程
- 简单时间获取,用c语言编写,客户端
- C语言课程设计 - 学生宿舍管理系统
- C语言大作业 西北工业大学
- 3DES,C语言版,ECB,PKCS7
- 利用LINUX FIFO命名管道技术实现双向聊
- C语言学生宿舍管理程序源代码
- kcf目标跟踪C代码
- 围棋C语言代码要满十字
- 逆波兰表达式 c语言实现
- 指法练习 C语言源代码
- 人工智能 八数码问题 A*算法 C语言
- 全国交通咨询模拟c语言版214055
- 基于C语言STC89C52单片机电子密码锁的
- C语言实现 简单的端口扫描
- C语言课程设计——超市商品库存管理
- RSA算法1024位C语言实现
- 一个基于单片机的温湿度程序
- 由c语言文件制作成mex文件的方法
评论
共有 条评论