#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编译时有问题
头文件格式有问题吧,对于系统的函数和变量声明头文件要用<>符号;对于自定义的头文件使用””符号!
 
                    


