• 大小: 8KB
    文件类型: .c
    金币: 1
    下载: 0 次
    发布日期: 2021-06-09
  • 语言: C/C++
  • 标签: C语言  

资源简介

实验内容要求: 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;   //HT1HT2分别存放权值最小和次小的节点的位置
    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;
  

评论

共有 条评论