上学期的class="superseo">数据结构哈夫曼编码,最后的实验,通过控制台输入一篇英语文章将其进行编码然后将编码的值存进一个文档中,然后根据文档的编码值将原文翻译出来分别将原文编码值还有译文分别存在不同的文件中。
开发环境 VScode.
开发语言C++
仅支持英语文档,中文文档无法支持。
实现原文如下
程序有一个小问题就是输入的文章最后要加一个数字9,作为终止条件。
文档环境要记得改为自己的路径文件名最好不要有中文。
代码如下
#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
#include
#include
#include
#include
using namespace std;
#define size 200
#define INF 0x3f3f3f3f
typedef struct hafuu {
char a;
int num = 0;
int map_location;//记录每个字符出现的次数还有在哈希数组中的位置用于定位英语字母
} huff;
typedef struct id {
int data;
int cixu;//
} id;
typedef struct hufman {
char data;//节点
int wai = 0;
int parent = 0, lc = 0, rc = 0;
int flag;
} hufman;
typedef struct di {
hufman *data;
int max_size;//哈夫曼表的属性
} stead;
typedef struct rf {
char *hd;
int nu;
} HD;
int main() {
vector<char> *hd;
char a;
stead sd;
int parent, child;
int rsize = 0;
ofstream ha("D:\Study\VScode\hashcode\hashtree.txt");
while (cin.get(a) && a != '9') {
ha << a;
}
ha << '9';
ha.close();
int b;
huff str[size];
ifstream ha2;
ha2.open("D:\Study\VScode\hashcode\hashtree.txt", ios::in);
while (ha2.get(a) && a != '9') {
b = (int)a;
str[b].num++;
str[b].a = a;
}
ha2.close();
int number = size;
while (number--) {
if (str[number].num == 0)
continue;
rsize++;
cout << "字符:" << str[number].a << "出现的次数:" << str[number].num
<< endl;
}
sd.data = new hufman[rsize * 2];
sd.max_size = rsize;
int i = 0;
for (number = 1, i = 1; i <= rsize; i++, number++) {
if (str[number].num == 0) {
i--;
continue;
}
str[number].map_location = i;
sd.data[i].data = str[number].a;
sd.data[i].wai = str[number].num;
cout << number << " " << str[number].map_location << endl;
}
HD *d;
d = new HD[size + 1];
int order = 0;
int j = 0;
id min[2];
min[0].data = INF, min[1].data = INF;
for (i = 1; i < rsize; i++) {//哈夫曼编码过程
for (int c = 0; c < 2; c++) {
for (j = 1; j <= 2 * rsize - 1; j++) {
if (sd.data[j].flag == 1 || sd.data[j].wai == 0)
continue;
if (sd.data[j].wai < min[c].data && sd.data[j].flag != 1) {
min[c].data = sd.data[j].wai;
min[c].cixu = j;
}
}
sd.data[(int)min[c].cixu].flag = 1;
}
order++;
sd.data[rsize + order].wai = min[0].data + min[1].data;
sd.data[rsize + order].lc = min[0].cixu;
sd.data[rsize + order].rc = min[1].cixu;
sd.data[min[0].cixu].parent = rsize + order;
sd.data[min[1].cixu].parent = rsize + order;
min[0].data = INF, min[1].data = INF;
cout << sd.data[min[0].cixu].parent << " " << min[0].cixu << " "
<< min[1].cixu << endl;
}
// char *temp=new char [rsize];
// int start = rsize;
// temp[rsize-1] = '=';
hd < new vectorchar[>+rsize 1 ];for
( =i 1 ;<= i ; rsize++ i)// start=rsize-1; {
for
( =child , i= parent . sd[data]child.;parent; parent=
child , parent= parent . sd[data]parent.)parentif {
( .sd[data]parent.==lc ) child[ {
hd]i.push_back('0');// temp[--start] = '0';
}
else [
hd]i.push_back('1');// temp[--start] = '1';
// cout << temp[start];
}
reverse
([hd]i.begin(),[ hd]i.end());// d[i].hd = new char [rsize - start];
// d[i].nu = rsize - start;
// strcpy(d[i].hd,&temp[start]);
// cout << d[i].hd[rt];
// for (int rt= 0; rt < d[i].nu; rt++) {
//}
// cout << endl;
}
.
ha2open("D:\Study\VScode\hashcode\hashtree.txt",:: ios)in;bianma
ofstream ("D:\Study\VScode\hashcode\hashtreecode.txt",:: ios)out;while
( .ha2get()a&& != a '9' )<< {
cout ; afor
( auto: i [ hd[str(int)]a.]map_location)<<
bianma ; i// for(int i=0;i
// bianma << d[str[(int)a].map_location].hd[i];
}
<<
bianma '9' ;.
ha2close();.
bianmaclose();char
; htrans
ifstream ("D:\Study\VScode\hashcode\hashtreecode.txt",:: ios)in;tra
ofstream ("D:\Study\VScode\hashcode\hash.txt",:: ios)out;=
parent ( int)(2* - rsize 1 );while
( .transget()h&& != h '9' )if {
( ==h '0' )= {
parent . sd[data]parent.;lcif
( .sd[data]parent.==lc 0 && . sd[data]parent.==rc 0 )<< {
tra . sd[data]parent.;data=
parent 2 * - rsize 1 ;}
}
else = {
parent . sd[data]parent.;rcif
( .sd[data]parent.==lc 0 && . sd[data]parent.==rc 0 )<< {
tra . sd[data]parent.;data=
parent 2 * - rsize 1 ;}
}
}
.
transclose();.
traclose();}
能力有限仅能写的这冗杂,不过具体功能是实现了。
还不错中间注释是原本用C语言写的不过到最后都无法解决一个数组越界问题就改为C++写了。
由于字符编码格式导致输出乱码是本人的带闹闹的问题不必担心
自动将乱码脑补成字符¥¥¥¥ 出现的次数为 999999
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)