#include”iostream”
#include”string.h”
#define n 8//此n为叶子的个数
typedef char** HuffmanCode;//表示HuffmanCode是char**的别名
using namespace std;
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 min = 99999;
//这个赋值要满足不是原来的最小值,这就难办了,也可以这样说,这个最小值其父母一定是为零的,这个范围必定是在
for (int i = 1; i < K + 1; i++)
if (a[i].weight < min&&a[i].parent == 0){
min = a[i].weight;
M = i;
}
int min2 = 99999;
for (int j = 1; j < K + 1; j++){
if (min2> a[j].weight&&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()
{
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;
}
#include”string.h”
#define n 8//此n为叶子的个数
typedef char** HuffmanCode;//表示HuffmanCode是char**的别名
using namespace std;
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 min = 99999;
//这个赋值要满足不是原来的最小值,这就难办了,也可以这样说,这个最小值其父母一定是为零的,这个范围必定是在
for (int i = 1; i < K + 1; i++)
if (a[i].weight < min&&a[i].parent == 0){
min = a[i].weight;
M = i;
}
int min2 = 99999;
for (int j = 1; j < K + 1; j++){
if (min2> a[j].weight&&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()
{
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;
}
解决方案
5
#pragma warning(disable:4996)
5
屏蔽提示strcpy不安全提示,假如有。
10
仅帮整理代码格式:
#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
10
这样能否就对了?
//挑选其中两个权值最小的 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]; }
10
#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编译时有问题,还是运行的时候有问题?
strcpy编译时有问题
头文件格式有问题吧,对于系统的函数和变量声明头文件要用<>符号;对于自定义的头文件使用””符号!