30/09/2018, 16:19

Bị lặp vô tận khi hiển thị cây

Khi mình hiển thị cây thì nó cứ chạy mãi chạy mãi mà chả ra cái gì cả

#include <stdio.h>
#include <stdlib.h>

typedef struct
{
    unsigned char c;
    int f;
    int used;
    int trai;
    int phai;
} nut;
typedef struct
{
    char *kitu;
    int ma;
} bangma;
nut tree[2304];
bangma bang[256];

void khoitao()
{
    int i;
    for (i=0; i<2304; i++)
    {
        tree[i].c=i;
        tree[i].f=0;
        tree[i].used=0;
        tree[i].trai=-1;
        tree[i].phai=-1;
    }
}

void tanso(char *file)
{
    FILE*f=fopen(file,"r");
    unsigned char c;
    int i;
    while (1)
    {
        fscanf(f,"%c",&c);
        if (feof(f))
            break;
        tree[c].f++;
    }
    fclose(f);
}

void bangthongke()
{
    printf("Bang thong ke tan suat: 
");
    for (int i = 0; i < 256; i++)
    {
        if (tree[i].f> 0)
            printf("%c: %d
",i, tree[i].f);
    }
}

int tim2min(int &i, int &j, int nNode)
{
    i = -1;
    j = -1;

// tim 2 phan tu co trong so nho nhat
    int k;
    for (k = 0; k < nNode; k++)
        if (tree[k].used == 0 && tree[k].f> 0)		  // Ki tu nay chua duoc xu ly va tan so lon hon 0
        {
            if (i == -1)
            {
                i = k;
            }
            else if (j == -1)
            {
                j = k;
            }
            else
            {
                if (tree[i].f> tree[j].f)
                {
                    if (tree[k].f < tree[i].f)
                    {
                        i = k;
                    }
                }
                else
                {
                    if (tree[k].f < tree[j].f)
                    {
                        j = k;
                    }
                }
            }
        }
    if (i != -1 && j!= -1)
    {
        if ( (tree[i].f > tree[j].f) || ((tree[i].f > tree[j].f) && (tree[i].c > tree[j].c)))
        {
            int t = i;
            i = j;
            j = t;
        }
        return 1;
    }
    else
    {
        return 0;
    }
}

int Taocay()
{
    int nNode = 256;
    int i, j;
    int timthay=0;

    while (1)
    {
        timthay=tim2min(i,j,nNode);
        if (!timthay)
            break;
        tree[nNode].c = (tree[i].c < tree[j].c) ? tree[i].c : tree[j].c;
        tree[nNode].f = tree[i].f + tree[j].f;
        tree[nNode].trai = i;
        tree[nNode].phai= j;

        tree[i].used = 1;
        tree[j].used = 1;

        // danh dau nut moi chua duyet
        tree[nNode].used = 0;
        nNode++;
    }
    return nNode-1;
}
void hienthi(int node, int tab)
{
    if (node == -1)
    {
        return;
    }
    int i;
    for (i = 0; i < tab; i++)
    {
        printf("	");
    }
    if (tree[node].trai == -1 && tree[node].phai == -1)
    {
        printf("%c
", tree[node].c);
    }
    else
    {
        printf("%c..
", tree[node].c);
        hienthi(tree[node].trai, tab + 1);
        hienthi(tree[node].phai, tab + 1);
    }
}

int main()
{
    khoitao;
    tanso("aa.txt");
    // bangthongke();
    int nRoot=Taocay();
    hienthi(nRoot,0);
}
Dang H. viết 18:24 ngày 30/09/2018

Hình như hàm tim2min bị sai. Bạn check lại xem. Lúc nào cũng trả về 0.

Bài liên quan
0