函数get2min的霍夫曼编码

时间:2018-04-06 17:30:50

标签: c function huffman-code

我正在做一个函数,给定一个包含Struct Code类型元素的数组,大小和两个指针 min_index1和min_index 2,应该给出我们可以找到的数组的索引 Code类型的两个元素,其最小出现次数优于0.这是 我用于霍夫曼编码的函数之一。

如果至少有两个元素优于0,则函数返回1。 否则,它返回0.我认为该功能不起作用,但我不知道为什么!

struct Code {
struct Code* parent; // noeud du niveau du dessus
struct Code* gauche; // noeud à gauche sur le niveau du dessous
struct Code* droit; // noeud à droite sur le niveau du dessous
char caractere; // le caractère stocké dans le noeud
int nb_occurrences; // le nombre d’occurrences du caractère
int code; // le bit 0 ou 1 pour aller du parent au noeud
};

int get2Min(struct Code code[], int taille, int *min_index1, int *min_index2) {
    char car_a_pas_regarder; /* Allows me to avoid some elements of the  array if I want to */ 
    int occurence_min = 0, i = 0, j;
    while ((occurence_min == 0) && (i < taille) ) {
        if (code[i].nb_occurrences > 0) {
            occurence_min = code[i].nb_occurrences;
            min_index1 = &i;
            car_a_pas_regarder = code[i].caractere;
            i++;
        }
        else {
            i++;
        }
    }
    for (j = i; j < taille; j++) {
        if (code[j].nb_occurrences < occurence_min && code[j].nb_occurrences > 0) {
            occurence_min = code[j].nb_occurrences;
            min_index1 = &j;
            car_a_pas_regarder = code[j].caractere;
        }
    }
    occurence_min = 0, i = 0;
    while ((occurence_min == 0) && (i < taille) ) {
        if (code[i].nb_occurrences > 0 && code[i].caractere != car_a_pas_regarder) {
            occurence_min = code[i].nb_occurrences;
            min_index2 = &i;
            car_a_pas_regarder = code[i].caractere;
            i++;
        }
        else {
            i++;
        }
    }
    for (j = i; j < taille; j++) {
        if (code[j].nb_occurrences < occurence_min && code[j].caractere != car_a_pas_regarder && code[j].nb_occurrences > 0) {
            occurence_min = code[j].nb_occurrences;
            min_index2 = &j;
        }
    }
    if (occurence_min > 0) {
        return 1;
    }
    else {
        return 0;
    }
}

1 个答案:

答案 0 :(得分:0)

使用min_index1 = &i;和其他人,你正在覆盖函数参数。我认为你的意思是*min_index1 = i;等等,将值传递给调用者。

我无法测试这个,因为问题的代码是一个不完整的例子,但我在下面评论过。

我还将代码简化为不必要复杂的代码。

struct Code {
    struct Code* parent; // noeud du niveau du dessus
    struct Code* gauche; // noeud à gauche sur le niveau du dessous
    struct Code* droit; // noeud à droite sur le niveau du dessous
    char caractere; // le caractère stocké dans le noeud
    int nb_occurrences; // le nombre d’occurrences du caractère
    int code; // le bit 0 ou 1 pour aller du parent au noeud
};

int get2Min(struct Code code[], int taille, int *min_index1, int *min_index2) {
    char car_a_pas_regarder; /* Allows me to avoid some elements of the  array if I want to */ 
    int occurence_min = 0, i = 0, j;
    while ((occurence_min == 0) && (i < taille) ) {
        if (code[i].nb_occurrences > 0) {
            occurence_min = code[i].nb_occurrences;
            *min_index1 = i;            // **corrected
            car_a_pas_regarder = code[i].caractere;
        }
        i++;                            // **simplified
    }
    for (j = i; j < taille; j++) {
        if (code[j].nb_occurrences < occurence_min && code[j].nb_occurrences > 0) {
            occurence_min = code[j].nb_occurrences;
            *min_index1 = j;            // **corrected
            car_a_pas_regarder = code[j].caractere;
        }
    }
    occurence_min = 0, i = 0;
    while ((occurence_min == 0) && (i < taille) ) {
        if (code[i].nb_occurrences > 0 && code[i].caractere != car_a_pas_regarder) {
            occurence_min = code[i].nb_occurrences;
            *min_index2 = i;            // **corrected
            car_a_pas_regarder = code[i].caractere;
        }
        i++;                            // **simplified
    }
    for (j = i; j < taille; j++) {
        if (code[j].nb_occurrences < occurence_min && code[j].caractere != car_a_pas_regarder && code[j].nb_occurrences > 0) {
            occurence_min = code[j].nb_occurrences;
            *min_index2 = j;
        }
    }
    return occurence_min > 0;           // **simplified
}