/*author:windy_2*/
/*修正版*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct slink
{
char data;
int wp;
int bm;
int mark;
struct slink *left;
struct slink *right;
}*link;
struct hfm
{
char data;
int wp;
};
struct T
{
int data;
struct T *next;
};
struct te
{
int data;
struct te *next;
};
struct slink* create_tree(struct hfm arr[],int len);
void print(struct slink *root);
int pop();
void push(int k);
struct T *T;
struct te *te;
int pop_s(struct T *strack);
void push_t(int k);
int pop_t();
int main()
{
struct slink *root;
int i,k=;
char str[];
char a[];
int b[];
int count,j;
struct hfm *arr;
T = (struct T*)malloc(sizeof(struct T));
T->data = ;
T->next = NULL;
te = (struct te*)malloc(sizeof(struct te));
te->data = ;
te->next = NULL;
printf("请输入你要进行编码的字符串: \n");
scanf("%s",str);
if(str[strlen(str)] == '\0')
{
str[strlen(str)]=NULL;
}
for(i = ;i < strlen(str);i++)
{
if(str[i]!='#')
{
a[k] = str[i];
b[k] = ;
for(j = ;j<strlen(str);j++)
{
if(str[j] == str[i])
{
b[k]++;
}
}
for(j = ;j<strlen(str);j++)
{
if(str[j] == a[k])
{
str[j] = '#';
}
}
k++;
}
count = k;
}
arr = (struct hfm*)malloc(sizeof(struct hfm)*count);
for(i = ;i < count;i++)
{
arr[i].data = a[i];
arr[i].wp = b[i];
}
root = (struct slink*)malloc(sizeof(struct slink));
root = create_tree(arr,count);
print(root);
}
struct slink* create_tree(struct hfm arr[],int len)
{
link ptrarr[];
link ptr,root = NULL;
int i,k1 = -,k2,j;
for(i = ;i < len;i++)
{
ptr = (link)malloc(sizeof(struct slink));
ptr->data = arr[i].data;
ptr->wp = arr[i].wp;
ptr->mark = ;
ptr->left = NULL;
ptr->right = NULL;
ptrarr[i] = ptr;
}
for(i = ;i < len;i++)
{
for(j = ;j < len;j++)
{
if(ptrarr[j]!=NULL&&k1==-)
{
k1 = j;
continue;
}
if(ptrarr[j]!=NULL)
{
k2 = j;
break;
}
}
for(j = k2;j < len;j++)
{
if(ptrarr[j] != NULL)
{
if(ptrarr[j]->wp > ptrarr[k1]->wp)
{
k2 = k1;
k1 = j;
}
else if(ptrarr[j]->wp < ptrarr[k2]->wp)
{
k2 = j;
}
}
}
root = (link)malloc(sizeof(struct slink));
ptrarr[k1]->bm = ;
ptrarr[k2]->bm = ;
root->wp = ptrarr[k1]->wp + ptrarr[k2]->wp;
root->data = '!';
root->mark = ;
root->left = ptrarr[k1];
root->right = ptrarr[k2];
ptrarr[k1] = root;
ptrarr[k2] = NULL;
}
return root;
}
void print(struct slink *root)
{
int temp;
struct T *p;
if(root == NULL)
{
return;
}
else
{
if(root->bm == ||root->bm == )
{
push(root->bm);
}
if(root->data != '!')
{
printf("%c的哈夫曼编码为: ",root->data);
root->mark = ;
temp = pop();
push_t(temp);
p = T->next;
while(p!=NULL)
{
temp = pop_s(p);
push_t(temp);
p = p->next;
}
while(te->next!=NULL)
{
temp = pop_t();
printf("%d",temp);
}
printf("\n");
if(root->bm == )
{
temp = pop();
}
}
print(root->left);
print(root->right);
}
}
int pop()
{
struct T *p;
int n;
if(T->next == NULL)
{
return ;
}
else
{
p = T->next;
n = p->data;
T->next = p->next;
free(p);
return n;
}
}
void push(int k)
{
struct T *strack;
strack = (struct T*)malloc(sizeof(struct T));
strack->data = k;
strack->next = T->next;
T->next = strack;
}
int pop_s(struct T *strack)
{
struct T *p;
int n;
if(T->next == NULL)
{
return ;
}
else
{
p = strack;
n = p->data;
return n;
}
}
void push_t(int k)
{
struct te *strack;
strack = (struct te*)malloc(sizeof(struct te));
strack->data = k;
strack->next = te->next;
te->next = strack;
}
int pop_t()
{
struct te *p;
int n;
if(te->next == NULL)
{
return -;
}
else
{
p = te->next;
n = p->data;
te->next = p->next;
free(p);
return n;
}
}

C-哈夫曼编码的更多相关文章

  1. 哈夫曼(huffman)树和哈夫曼编码

    哈夫曼树 哈夫曼树也叫最优二叉树(哈夫曼树) 问题:什么是哈夫曼树? 例:将学生的百分制成绩转换为五分制成绩:≥90 分: A,80-89分: B,70-79分: C,60-69分: D,<60 ...

  2. (转载)哈夫曼编码(Huffman)

    转载自:click here 1.哈夫曼编码的起源: 哈夫曼编码是 1952 年由 David A. Huffman 提出的一种无损数据压缩的编码算法.哈夫曼编码先统计出每种字母在字符串里出现的频率, ...

  3. 数据结构图文解析之:哈夫曼树与哈夫曼编码详解及C++模板实现

    0. 数据结构图文解析系列 数据结构系列文章 数据结构图文解析之:数组.单链表.双链表介绍及C++模板实现 数据结构图文解析之:栈的简介及C++模板实现 数据结构图文解析之:队列详解与C++模板实现 ...

  4. HDU2527 哈夫曼编码

    Safe Or Unsafe Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  5. *HDU1053 哈夫曼编码

    Entropy Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Sub ...

  6. YTU 3027: 哈夫曼编码

    原文链接:https://www.dreamwings.cn/ytu3027/2899.html 3027: 哈夫曼编码 时间限制: 1 Sec  内存限制: 128 MB 提交: 2  解决: 2 ...

  7. 使用F#来实现哈夫曼编码吧

    最近算法课要求实现哈夫曼编码,由于前面的问题都是使用了F#来解决,偶然换成C#也十分古怪,报告也不好看,风格差太多.一开始是打算把C#版本的哈夫曼编码换用F#来写,结果写到一半就觉得日了狗了...毕竟 ...

  8. 赫夫曼\哈夫曼\霍夫曼编码 (Huffman Tree)

    哈夫曼树 给定n个权值作为n的叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree).哈夫曼树是带权路径长度最短的树,权值较大的结点离 ...

  9. hdu2527哈夫曼编码

    /* Safe Or Unsafe Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...

  10. [数据结构与算法]哈夫曼(Huffman)树与哈夫曼编码

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

随机推荐

  1. 15 款 jQuery 社交分享插件

    过去几年中社交媒体越来越流行了,能够分享音乐.视频.图像甚至是其他的 docs 文档到互联网上去,这样子还能够提高页面的点击量.通常,一些社交媒体插件都能允许你的用户分享你网站上的内容到其他的社交平台 ...

  2. C++中代理类和句柄类

    指针是 C 与其他语言区别的重要特征之一,在 C++ 中,指针也被广泛运用,我们通过指针实现多态.然而,众所周知,指针的使用必须小心,否则很容易造成内存泄漏 Memory Leak.当我们有几个指针指 ...

  3. CPU的最小执行单位是线程,协程不需要qt支持...直接用现成的协程库就行了

    协程也就在I/O操作上才有优势,Qt事件循环,本事很多I/O已经是异步了,利用好异步(虽然都说异步有点反人类思维).因为CPU的执行最小单位是线程,协程也只是在其之上又调度而已. 我的意思是利用好异步 ...

  4. 3017C语言_文件

    第七章  文件 7.1  C语言文件的概念 7.1.1 文件的概念 在此之前,所有的输入和输出只涉及到键盘和显示器.在运行C程序时,我们通过键盘输入数据并借助显示器把程序的运算结果显示出来.但是,计算 ...

  5. C++按格式接收输入字符(京东,滴滴,360笔试必用)

    头一次起这种标题,为了对得起这个标题,我尽量多写点~ 最近还是一边实习一遍投简历--笔试--面试,然而发现了自己的好多问题. 在答了京东笔试(滴滴,360也是这样的)的题后,发现与腾讯,阿里等公司的不 ...

  6. Demo小细节

    (1) 程序如下: public class Example { static int i = 1, j = 2; static { display(i); i = i + j; } static v ...

  7. selenium3+python3自动化测试学习之网页元素定位

    selenium基础实战之定位网页元素技巧 selenium定位网页元素 find_element_by_id,find_element_by_name,find_element_by_class_n ...

  8. GRPC Oauth Identity

    gRPC中集成asp.net identity实现oAuth认证 在asp.net core 3.0中开启identity认证 asp.net core 3.0种需要导入的identity包与core ...

  9. 西门子S7-1200与 G120系列变频器USS通信

    西门子S7-1200 紧凑型PLC在当前的市场中有着广泛的应用,作为经常与SINAMICS G120系列变频器共同使用的PLC,其USS通信协议的使用一直在市场上有着非常广泛的应用.本文将主要介绍如何 ...

  10. IDM 6.27.5(Internet Download Manager)中文破解版下载神器

    IDM一直是我最喜欢的下载工具,感觉用的比迅雷爽,简单使用,对付网盘有一套.IDM(Internet Download Manager)和迅雷的下载提速方式不同,从原理上来说,IDM速度较稳定,迅雷下 ...