HT[0] = { -1 ,-1,-1,'-1' }; //初始化基础结点 for (i = 1, p = HT, ++p; i <= n; ++i, ++p, ++w){//前n个赋权值 *p = { (*w)->ww,0,0,0,(*w)->cc };} //剩余部分初始化为0 for (i; i <= m; ++i, ++p){ *p = { 0,0,0,0,'0' };}
时间: 2023-09-25 11:11:07 浏览: 83
这段代码中的问题和之前的一样,主要是结构体初始化的方式不正确,应该使用赋值语句或者使用花括号括起来的初始化列表。
下面是修改后的代码:
```c++
HT[0].weight = -1;
HT[0].parent = -1;
HT[0].lchild = -1;
HT[0].rchild = -1;
HT[0].data = '-';
for (i = 1, p = HT + 1; i <= n; ++i, ++p, ++w) {
p->weight = (*w)->ww;
p->parent = 0;
p->lchild = 0;
p->rchild = 0;
p->data = (*w)->cc;
}
for (; i <= m; ++i, ++p) {
p->weight = 0;
p->parent = 0;
p->lchild = 0;
p->rchild = 0;
p->data = '0';
}
```
注意,这里只是简单修复了代码中的语法错误,并未对算法本身做出修改。如果还有其他问题,可以再提出来让我看看。
相关问题
void InitHffman(Tree& HT, NumberWeight w, int n) { Tree p = NULL; if (n <= 1) return; int m, i; //赫夫曼树结点个数 m = 2 * n - 1; HT = (Tree)malloc((m + 1) * sizeof(HTNode)); //头节点 HT[0] = { -1,-1,-1,'-1'}; //初始化基础结点 for (i = 1, p = HT, ++p; i <= n; ++i, ++p, ++w)//前n个赋权值 *p = { (*w)->ww,0,0,0,(*w)->cc }; //剩余部分初始化为0 for (i; i <= m; ++i, ++p) *p = { 0,0,0,0,'0' }; }
这段代码中有几个问题:
1. 第3行中的变量 `Tree` 没有定义,应该先定义结构体类型 `HTNode`,再用 `typedef` 定义 `Tree` 为指向 `HTNode` 结构体的指针类型。
2. 第7行中的变量 `Tree p` 被定义为指向 `HTNode` 结构体的指针类型,但没有初始化,可能会导致非法访问内存。
3. 第12行中的结构体初始化方式是错误的,应该使用赋值语句或者使用花括号括起来的初始化列表。
下面是修改后的代码:
```c++
typedef struct HTNode {
int weight; // 权值
int parent, lchild, rchild; // 父结点、左孩子、右孩子
char data; // 结点值(仅叶子结点有)
} HTNode, *Tree;
void InitHffman(Tree& HT, NumberWeight w, int n) {
Tree p = NULL;
if (n <= 1) return;
int m, i;
m = 2 * n - 1;
HT = (Tree)malloc((m + 1) * sizeof(HTNode));
HT[0].weight = -1;
HT[0].parent = -1;
HT[0].lchild = -1;
HT[0].rchild = -1;
HT[0].data = '-';
for (i = 1, p = HT + 1; i <= n; ++i, ++p, ++w) {
p->weight = w->ww;
p->parent = 0;
p->lchild = 0;
p->rchild = 0;
p->data = w->cc;
}
for (; i <= m; ++i, ++p) {
p->weight = 0;
p->parent = 0;
p->lchild = 0;
p->rchild = 0;
p->data = '0';
}
}
```
注意,这里只是简单修复了代码中的语法错误,并未对算法本身做出修改。如果还有其他问题,可以再提出来让我看看。
以下是哈夫曼树的创建,怎么把节点值和权值由键盘输入改成从文件中读取信息://创造哈夫曼树 void CreateHuffmanTree(HuffmanTree &HT, int num) { int m,f; char c; m = 2 * num - 1; HT = new HTNode[m + 1]; //分配空间 for (int i = 1; i <= m; i++) //初始化 { HT[i].parent = 0; HT[i].lchild = 0; HT[i].rchild = 0; } cout << "请输入每个数据及其权值:" << endl; for (int i = 1; i <= num; i++) { printf("输入第%d个元素的=>\n",i); printf("\t结点值:"); scanf("%c",&c); HT[i].data=getchar(); printf("\t权值:"); scanf("%d",&f); HT[i].weight=f; //scanf("%d",HT[i].weight) ; //HT[i].data=n; //scanf("%[^\n]",HT[i].data); // cin >> HT[i].weight; // cin>>HT[i].data; } for (int i = num + 1; i <= m; i++) //构建哈夫曼树 { MIN min; min=Select(HT,i-1); //选择二叉树 HT[min.s1].parent = i; HT[min.s2].parent = i; HT[i].lchild = min.s1; HT[min.s1].num = "0"; HT[i].rchild = min.s2; HT[min.s2].num = "1"; HT[i].weight = HT[min.s1].weight + HT[min.s2].weight; HT[i].data = -1; } putlorinnum(HT, m); for (int i = 1; i <= m; i++) //进行每个字符哈夫曼码的输出 { if(HT[i].data != -1) { cout<<HT[i].data<<" 权重为"<<HT[i].weight<<" ,哈夫曼码为:"<<HT[i].num<<endl; cout<<endl; } } }
可以使用文件输入流来读取信息,具体操作如下:
1. 在头文件中添加 `#include<fstream>`,使用文件输入输出流需要包含这个头文件。
2. 打开文件,将文件中的信息读入到程序中。
```c++
ifstream infile("filename.txt"); //打开文件
if (!infile) //文件打开失败
{
cout << "文件打开失败!" << endl;
exit(1);
}
for (int i = 1; i <= num; i++)
{
printf("输入第%d个元素的=>\n",i);
printf("\t结点值:");
infile>>c;
HT[i].data = c;
printf("\t权值:");
infile>>f;
HT[i].weight = f;
}
infile.close(); //关闭文件
```
3. 将输入流对象作为参数传递给函数,即修改函数声明为:
```c++
void CreateHuffmanTree(HuffmanTree &HT, int num, ifstream &infile)
```
4. 在主函数中调用时,传递文件输入流对象作为参数:
```c++
ifstream infile("filename.txt"); // 打开文件
CreateHuffmanTree(HT, num, infile); // 调用函数
infile.close(); // 关闭文件
```
阅读全文