一个莫名其妙的问题,求大神解释!
下面这个程序是建立哈夫曼树的,输出时会发生莫名其妙的错误,然后当我在hafumanCoding函数中加上
printf("%d",1);这段代码(任意的输出都行);程序就没问题了?到底怎么回事?
还有编译时的这段警告是什么意思?
C:\Users\Lenovo\c_c++\test\main.cpp|42|warning: extended initializer lists only available with -std=c++0x or -std=gnu++0x|
- C/C++ code
#include <cstdio>#include <algorithm>using namespace std;typedef struct node{ unsigned weight; unsigned parent,lchild,rchild;}HTNode,*HaffmanTree;typedef char **HaffmanCode;void select(HaffmanTree T, int n, int *s1, int *s2){ unsigned min=32767,nmin=32767; int vmin=0,vnmin=0; for(int i=0; i<n; i++){ if(T[i].parent!=0) continue; if(min>=T[i].weight){ nmin = min; vnmin = vmin; min = T[i].weight; vmin = i; }else if(nmin>T[i].weight){ nmin = T[i].weight; vnmin = i; } } *s1 = vmin,*s2 = vnmin;}void haffmanCoding(HaffmanTree *T, unsigned *w, int n){ //printf("%d",1); if(n<=1) return; int i, s1, s2; int m = 2*n-1; *T = (HaffmanTree)malloc(sizeof(HaffmanCode) * m); HaffmanTree p = *T; for(i=0; i<n; i++,p++,w++) *p = {*w,0,0,0}; for(;i<m;i++,p++) *p = {0,0,0,0}; for(i=n; i<m; i++){ select(*T,i,&s1,&s2); (*T)[s1].parent = i; (*T)[s2].parent = i; (*T)[i].lchild = s1; (*T)[i].rchild = s2; (*T)[i].weight = (*T)[s1].weight+(*T)[s2].weight; }}int main(){ unsigned w[5] = {4,6,8,1,3}; HaffmanTree HT; haffmanCoding(&HT, w, 5); for(int i=0; i<9; i++){ printf("%u\t",HT[i].weight); } return 0;}[解决办法]
- C/C++ code
#include <cstdio>#include <algorithm>using namespace std;typedef struct node{ unsigned weight; unsigned parent,lchild,rchild;}HTNode,*HaffmanTree;typedef char **HaffmanCode;void select(HaffmanTree T, int n, int *s1, int *s2){ unsigned min=32767,nmin=32767; int vmin=0,vnmin=0; for(int i=0; i<n; i++){ if(T[i].parent!=0) continue; if(min>=T[i].weight){ nmin = min; vnmin = vmin; min = T[i].weight; vmin = i; }else if(nmin>T[i].weight){ nmin = T[i].weight; vnmin = i; } } *s1 = vmin,*s2 = vnmin;}void haffmanCoding(HaffmanTree *T, unsigned *w, int n){ //printf("%d",1); if(n<=1) return; int i, s1, s2; int m = 2*n-1; *T = (HaffmanTree)malloc(sizeof(HaffmanCode) * m); HaffmanTree p = *T; for(i=0; i<n; i++,p++,w++){ p->weight=*w; p->parent=0; p->lchild=0; p->rchild=0; }/*结构体除了初始化,不能一起赋值啊....下面也是,自己搞定*/ for(;i<m;i++,p++) *p = {0,0,0,0}; for(i=n; i<m; i++){ select(*T,i,&s1,&s2); (*T)[s1].parent = i; (*T)[s2].parent = i; (*T)[i].lchild = s1; (*T)[i].rchild = s2; (*T)[i].weight = (*T)[s1].weight+(*T)[s2].weight; }}int main(){ unsigned w[5] = {4,6,8,1,3}; HaffmanTree HT; haffmanCoding(&HT, w, 5); for(int i=0; i<9; i++){ printf("%u\t",HT[i].weight); } return 0;}