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);
}
Bài liên quan
Hình như hàm
tim2min
bị sai. Bạn check lại xem. Lúc nào cũng trả về 0.