数据结构的课程设计是十分重要的一点,但是在我打课程设计时,并没有在网上找到适合自己的,简单易懂的代码,所以在我的潜心研究下,经过我的努力,我打出了自己的代码,简单易懂,清晰可辨,贼6,有点小得意,不懂的多思考思考偶。
不废话,接下来是我的代码:
#include<iostream>
#include<string>
#include<stdio.h>
#include<string>
using namespace std;
struct Node {
double weight;
string ch;
string code;
int lchild, rchild, parent;
};
void Select(Node huffTree[], int *a, int *b, int n) { //找权值最小的两个a和b,n即为k
int i;
double weight = 0; //找最小的数
for (i = 0; i <n; i++) {
if (huffTree[i].parent != -1) //判断节点是否已经选过
continue;
else {
if (weight == 0) {
weight = huffTree[i].weight;
*a = i;
} else {
if (huffTree[i].weight < weight) {
weight = huffTree[i].weight;
*a = i;
}
}
}
}
weight = 0; //找第二小的数
for (i = 0; i < n; i++) {
if (huffTree[i].parent != -1 || (i == *a))//排除已选过的数
continue;
else {
if (weight == 0) {
weight = huffTree[i].weight;
*b = i;
} else {
if (huffTree[i].weight < weight) {
weight = huffTree[i].weight;
*b = i;
}
}
}
}
int temp;
if (huffTree[*a].lchild>huffTree[*b].lchild) { //小的数放左边
temp = *a;
*a = *b;
*b = temp;
}
}
void Huff_Tree(Node huffTree[], int w[], string ch[], int n) {
for (int i = 0; i < 2 * n - 1; i++) { //初始过程
huffTree[i].parent = -1;
huffTree[i].lchild = -1;
huffTree[i].rchild = -1;
huffTree[i].code = "";
}
for (int i = 0; i < n; i++) {
huffTree[i].weight = w[i];
huffTree[i].ch = ch[i];
}
for (int k = n; k < 2 * n - 1; k++) {
int i1 = 0;
int i2 = 0;
Select(huffTree, &i1, &i2, k); //将i1,i2节点合成节点k
huffTree[i1].parent = k;
huffTree[i2].parent = k;
huffTree[k].weight = huffTree[i1].weight + huffTree[i2].weight;
huffTree[k].lchild = i1;
huffTree[k].rchild = i2;
}
}
void Huff_Code(Node huffTree[], int n) {
int i, j, k;
string s = "";
for (i = 0; i < n; i++) {
s = "";
j = i;
while (huffTree[j].parent != -1) { //从叶子往上找到根节点
k = huffTree[j].parent;
if (j == huffTree[k].lchild) { //如果是根的左孩子,则记为0
s = s + "0";
} else {
s = s + "1";
}
j = huffTree[j].parent;
}
//cout << "字符 " << huffTree[i].ch << " 的编码:";
for (int l = s.size() - 1; l >= 0; l--) {
//cout << s[l];
huffTree[i].code += s[l]; //保存编码
}
// cout << endl;
}
}
void outMessage(Node huffTree[],int n)
{
for(int i=0;i<n;i++)
{
cout << "字符 " << huffTree[i].ch << " 的编码:"<<" "<<huffTree[i].code<<endl;
}
}
string Huff_Decode(Node huffTree[], int n) {
string s;
cout << "输入编码:"<<endl;
cin >> s;
string temp = "",str="";//保存解码后的字符串
for (int i = 0; i < s.size(); i++) {
temp = temp + s[i];
for (int j = 0; j < n; j++) {
if (temp == huffTree[j].code) {
str=str+ huffTree[j].ch;
temp = "";
break;
} else if (i == s.size()-1&&j==n-1&&temp!="") { //全部遍历后没有
str= "解码错误!";
}
}
}
return str;
}
string Huff_Decodenumber(Node huffTree[], int n) {
string s;
cout << "输入字符:"<<endl;
cin >> s;
string temp="";
string str="";//保存解码后的字符串
for (int i = 0; i < s.size(); i++) {
temp =s[i];
for (int j = 0; j < n; j++) {
if (temp == huffTree[j].ch) {
str=str+ huffTree[j].code;
temp = "";
break;
} else if (i == s.size()-1&&j==n-1&&temp!="") { //全部遍历后没有
str= "解码错误!";
}
}
}
return str;
}
int main() {
//编码过程
cout<<endl;
cout<<endl;
cout<<endl;
cout<<endl;
cout<<endl;
cout<<endl;
cout<<" "<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"<<endl;
cout<<endl;
cout<<" "<<" 欢迎进入"<<endl;
cout<<endl;
cout<<" "<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"<<endl;
cout<<endl;
cout<<endl;
cout<<"按Enter键继续。。。"<<endl;
getchar();
system("cls");
//cout<<"请输入";
cout<<"请输入你要输入字符的数量"<<endl;
int n;
cin>>n;
if(n==1)
{
cout<<"一个字符无需编码"<<endl;
exit(0);
}
Node huffTree[2 * n];
string str[n];
int w[n];
cout<<"请输入你要输入的字符和权值"<<endl;
for(int i=0; i<n; i++) {
string a;
int b;
cout<<"输入第"<<i+1<<"个字符"<<endl;
cin>>a;
cout<<"输入第"<<i+1<<"个字符的权值"<<endl;
cin>>b;
str[i]=a;
w[i]=b;
}
cout<<"按Enter键继续。。。"<<endl;
getchar();
system("cls");
Huff_Tree(huffTree, w, str, n);
Huff_Code(huffTree, n);
int end=1;
while(end)
{
cout<<"有以下几种功能:"<<endl;
cout<<"1.输入报文编码解析得到字符信息"<<endl<<endl;
cout<<"2.输入字符信息得到报文编码"<<endl<<endl;
cout<<"3.退出程序"<<endl<<endl;
cout<<"输入你要选择的功能:"<<endl;
int i;
cin>>i;
cout<<endl;
cout<<endl;
getchar();
cout<<"按Enter键继续。。。"<<endl;
getchar();
system("cls");
switch(i)
{
case 1:
outMessage(huffTree,n);
cout << Huff_Decode(huffTree, n)<< endl;
break;
case 2:
outMessage(huffTree,n);
cout << Huff_Decodenumber(huffTree, n)<< endl;
break;
case 3:
end=0;
}
if(end==0)
{
cout<<"程序终止"<<endl;
exit(0);
}
}
//解码过程
// string s;
// cout << "输入编码:";
// cin >> s;
// cout << Huff_Decode(huffTree, n)<< endl;
// system("pause");//终止
return 0;
}