69,371
社区成员
发帖
与我相关
我的任务
分享
#include<iostream>
#include<string.h>
using namespace std;
#define n 8//此n为叶子的个数
typedef char** HuffmanCode;//表示HuffmanCode是char**的别名
typedef struct
{
int weight;
int parent, lchild, rchild;
}HTNode, *HuffmanTree;
//初始化数组
void Initial_HT(HTNode a[])
{
for (int i = 1; i < 2 * n; i++){
a[i].weight = a[i].parent = a[i].lchild = a[i].rchild = 0;
}
}
//挑选其中两个权值最小的
void Select_HT(HTNode a[], int K, int &M, int &N)//这个函数有问题
{
int min1;
min1 = 99999;
//这个赋值要满足不是原来的最小值,这就难办了,也可以这样说,这个最小值其父母一定是为零的,这个范围必定是在
for (int i = 1; i < K + 1; i++)
if (a[i].weight < min1 && a[i].parent == 0){
min1 = a[i].weight;
M = i;
}
int min2;
min2 = 99999;
for (int j = 1; j < K + 1; j++){
if (a[j].weight < min2 && a[j].parent == 0 && j != M){
min2 = a[j].weight;
N = j;
}
}
}
//创建一哈夫曼树
void Create_HT(HTNode a[])
{
cout << "输进叶子结点的权值:" << endl;
for (int i = 1; i < n + 1; i++){
cin >> a[i].weight;
}
int M = 0, N = 0;
for (int j = n + 1; j < 2 * n; j++){
Select_HT(a, j - 1, M, N);//其作用将实现的功能有返回最小的两个下标//忘了除去已有的父母的结点了
a[M].parent = a[N].parent = j;
a[j].lchild = M;
a[j].rchild = N;
a[j].weight = a[N].weight + a[M].weight;
}
}
void Print_HT(HTNode a[])
{
for (int i = 1; i < 2 * n; i++){
cout << a[i].weight << " ";
}
}
void Serect_HT(HTNode a[], HuffmanCode &HC)//求哈夫曼编码
{
char *cd = NULL;
HC = new char*[n + 1];
cd = new char[n];
cd[n - 1] = '\0';
for (int i = 1; i <= n; i++){
int start = n - 1;
int f = a[i].parent;
int c = a[i].weight;
while (f != 0)
{
--start;
if (c == a[f].lchild)
cd[start] = '0';
else cd[start] = '1';
c = a[f].weight;
f = a[f].parent;
}
//cout << "sdgsfsd" << endl;
HC[i] = new char[n - start];
strcpy(HC[i],&cd[start]);
}
delete cd;
}
void Print_HC(HuffmanCode &HC)
{
for (int i = 1; i < n + 1; i++)
{
cout << HC[i]<<" ";
}
}
int main(void)
{
HTNode a[2 * n];
Initial_HT(a);
Create_HT(a);
Print_HT(a);
HuffmanCode HC = NULL;
Serect_HT(a, HC);
Print_HC(HC);
return 0;
}
我这边试运行了一下:
提示:输进叶子结点的权值:
输入:1 2 3 4 5 6 7 8
输出:1 2 3 4 5 6 7 8 3 6 9 12 15 21 36 11000 11001 1100 110 111 110 10 11//挑选其中两个权值最小的
void Select_HT(HTNode a[], int K, int &M, int &N)
{
int wi[2*n],wt[2*n],t;
for (int i=1;i<K+1;i++) {
wi[i]=i;
wt[i]=a[i].weight;
}
for (int i=1;i<K;i++) {
for (int j=i+1;j<K+1;j++) {
if (wt[i]>wt[j]) {
t=wt[i];wt[i]=wt[j];wt[j]=t;
t=wi[i];wi[i]=wi[j];wi[j]=t;
}
}
}
M=wi[1];
N=wi[2];
}
#pragma warning(disable:4996)
#include<iostream>
2 #include<string.h>
3
4 using namespace std;
5
6 #define n 8//此n为叶子的个数
7
8 typedef char** HuffmanCode;//表示HuffmanCode是char**的别名
9
10 typedef struct
11 {
12 int weight;
13 int parent, lchild, rchild;
14 }HTNode, *HuffmanTree;
15
16 //初始化数组
17 void Initial_HT(HTNode a[])
18 {
19 for (int i = 1; i < 2 * n; i++){
20 | a[i].weight = a[i].parent = a[i].lchild = a[i].rchild = 0;
21 }
22 }
23
24
25 //挑选其中两个权值最小的
26 void Select_HT(HTNode a[], int K, int &M, int &N)//这个函数有问题
27 {
28 int min = 99999;
29 //这个赋值要满足不是原来的最小值,这就难办了,也可以这样说,这个最小值其父母一定是为零的,这个范围必定是在
30 for (int i = 1; i < K + 1; i++)
31 | if (a[i].weight < min&&a[i].parent == 0){
32 | | min = a[i].weight;
33 | | M = i;
34 | }
35 int min2 = 99999;
36 for (int j = 1; j < K + 1; j++){
37 | if (min2> a[j].weight&&a[j].parent == 0 && j != M){
38 | | min2 = a[j].weight;
39 | | N = j;
40 | }
41 }
42 }
43
44 //创建一哈夫曼树
45 void Create_HT(HTNode a[])
46 {
47 cout << "输进叶子结点的权值:" << endl;
48 for (int i = 1; i < n + 1; i++){
49 | cin >> a[i].weight;
50 }
51 int M = 0, N = 0;
52 for (int j = n + 1; j < 2 * n; j++){
53 | Select_HT(a, j - 1, M, N);//其作用将实现的功能有返回最小的两个下标//忘了除去已有的父母的结点了
54 | a[M].parent = a[N].parent = j;
55 | a[j].lchild = M;
| a[j].rchild = N;
45 | a[j].weight = a[N].weight + a[M].weight;
44 }
43 }
42 void Print_HT(HTNode a[])
41 {
40 for (int i = 1; i < 2 * n; i++){
39 | cout << a[i].weight << " ";
38 }
37 }
36
35 void Serect_HT(HTNode a[], HuffmanCode &HC)//求哈夫曼编码
34 {
33 char *cd = NULL;
32 HC = new char*[n + 1];
31 cd = new char[n];
30 cd[n - 1] = '\0';
29 for (int i = 1; i <= n; i++){
28 | int start = n - 1;
27 | int f = a[i].parent;
26 | int c = a[i].weight;
25 | while (f != 0)
24 | {
23 | | --start;
22 | | if (c == a[f].lchild)
21 | | | cd[start] = '0';
20 | | else cd[start] = '1';
19 | | | c = a[f].weight;
18 | | f = a[f].parent;
17 | }
16 | //cout << "sdgsfsd" << endl;
15 | HC[i] = new char[n - start];
14 | strcpy(HC[i],&cd[start]);
13 }
12 delete cd;
11 }
10
9
8 void Print_HC(HuffmanCode &HC)
7 {
6 for (int i = 1; i < n + 1; i++)
5 {
4 | cout << HC[i]<<" ";
3 }
2 }
1
102 int main(void)
1 {
2 HTNode a[2 * n];
3 Initial_HT(a);
4 Create_HT(a);
5 Print_HT(a);
6 HuffmanCode HC = NULL;
7 Serect_HT(a, HC);
2 Print_HC(HC);
1 return 0;
112 }
strcpy编译时有问题,还是运行的时候有问题?