读书人

一个莫名其妙的有关问题求大神解释

发布时间: 2012-11-04 10:42:42 作者: rapoo

一个莫名其妙的问题,求大神解释!
下面这个程序是建立哈夫曼树的,输出时会发生莫名其妙的错误,然后当我在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;} 

读书人网 >C语言

热点推荐