1)我有一个结构
struct node
{
char symbol;
int freq;
int left, right,root;
int value;
short is_sorted;
};
struct node data[1000];
其中 data[215].freq(频率){0,1,2,3,4,5} 是通过从文件“Input.txt”中读取以下字母符号(symbol)(abcdef)值作为唯一参数来获得的。现在我必须添加该数组的两个最小频率,然后将新获得的元素放置在同一个数组中,以便它将保持频率的递增顺序(它已经排序数组,看到我们有 0,1,2,3 ,4,5)。
(2)还要注意的是,添加的最小的两个元素不能再参与排序和加法,如果已经添加了就必须固定一次位置,但是加法新得到的元素可以参加加法和再次排序。例如:我们将两个最小元素0和1相加,0+1=1,所以“1”是相加的结果,现在这个“1”必须定位在data[].freq中,这样仍然应该是递增的顺序。所以 :
data[i].freq = 0 1 1(added here) 2 3 4 5
现在我们必须再次找到最小的两个节点(请再次阅读注释(2)以便更好地理解)。我们不能再次添加0和1,因为它们已经参与了加法。所以这次我们将添加 1 和 2(这个位于索引 3 处,请不要与索引 2 处的那个混淆)。所以我们得到 1+2=3
0 1 1 2 3 3 4 5 我们再次定位 3 来维持递增顺序。我们再次重复:对于索引 4 和 5 处的元素(因为我们已经对索引 0,1 和 2,3 处的元素进行了加法),我们将得到 3+3=6,再次将其放置在 data[].freq 中。
0 1 1 2 3 3 4 5 6 这次 6 大于 4 和 5,因此它将出现在 5 之后以保持递增顺序。
最后我们会得到data[dataSize].freq
像这样:
data[dataSize].freq= [0 1 1 2 3 3 4 5 6 9 15].
所以加法保持在索引 0,1 和 2,3 和 4,5 和 6, 7 和 8,9 之间,最后我们有 15,这是最后一个,所以我们在这里停止。这部分我已经在我的代码中完成了.
我需要什么帮助?当我运行代码时,显示数据将如下所示:Symbol Freq Left Right
(它实际上是一个仅使用数组的哈夫曼树实现,没有 malloc 和指针)。
预期的输出是这样的:(当我使用 qsort() 时,它工作正常,但由于复杂原因,我没有使用 qsort() ):
./extended Input.txt
Reading file...
Data is:
0: symbol: a, Freq: 0, Left: -1, Right -1
1: symbol: b, Freq: 1, Left: -1, Right -1
2: symbol: 0, Freq: 1, Left: 0, Right 1
3: symbol: c, Freq: 2, Left: -1, Right -1
4: symbol: d, Freq: 3, Left: -1, Right -1
5: symbol: 5, Freq: 3, Left: 2, Right 3
6: symbol: e, Freq: 4, Left: -1, Right -1
7: symbol: f, Freq: 5, Left: -1, Right -1
8: symbol: 4, Freq: 6, Left: 4, Right 5
9: symbol: 3, Freq: 9, Left: 6, Right 7
10: symbol: 2, Freq: 15, Left: 8, Right 9
d: 00
a: 0100
b: 0101
c: 011
e: 10
f: 11
所以我已经实现了上面提到的算法,它对于打印频率(Freq)效果很好但它没有正确打印符号和左右子元素,我尝试了很长时间,但无法弄清楚我的代码中有错误的地方。(我确信树创建部分是正确的(即遍历)tree() 函数,问题出在代码中的某些地方在main() 函数,而且我已经评论了可疑的部分)。
下面是我的代码:
nt main(int argc, char **argv)
{
int i,count=0,j,f,s;
struct node data[1000];
int data_size=-1;
if(argc<2)
{
printf("Provide input file..");
return;
}
printf("Reading file...\n");
read_data(argv[1], data, &data_size);
printf("datasize: %d\n", data_size);
for (i=0; i+1<data_size; i+=2)
{
//printf("count1: %d\n", count);
data[data_size].symbol='0'+count;
data[data_size].freq=data[data_size].root =data[i].freq+data[i+1].freq;
data[data_size].left=i;
data[data_size].right=i+1;
data[i].value=0;
data[i+1].value=1;
data[i].is_sorted=1;
data[i+1].is_sorted=1;
data[data_size].value='\0';
data[data_size].is_sorted=0;
for (j=data_size-1; j>f+1; j--)
{
if (data[data_size].root >=data[j].freq)
{
// printf("Inside if loop\n");
break;
}
else
{
// printf("else loop\n");
data[j+1].freq=data[j].freq;
data[j+1].symbol=data[j].symbol ;
data[j+1].left=data[j].left ;
data[j+1].right=data[j].right ;
//data[j+1]=data[j];
}
}
////////////////
//printf("data[j+1].sym1: %c\n", data[j+1].symbol );
data[j+1].freq=data[data_size].root ;
data[j+1].symbol=data[data_size].symbol ;
data[j+1].left=data[data_size].left ;
data[j+1].right=data[data_size].right ;
count=count_unsorted(data,data_size);
data_size++;
printf("count2: %d\n", count);
}
printf("Data is:\n");
for(i=0;i<data_size;i++)
{
printf("%d: symbol: %c, Freq: %d, Left: %d, Right %d\n", i,data[i].symbol, data[i].freq, data[i].left, data[i].right);
}
char path[100]={'\0'};
traverse_tree(data, data_size-1,path);
return 0;
}
我的代码的输出是:
Reading file...
0: symbol: a, Freq: 0, Left: -1, Right -1
1: symbol: b, Freq: 1, Left: -1, Right -1
2: symbol: f, Freq: 1, Left: -1, Right -1
3: symbol: c, Freq: 2, Left: -1, Right -1
4: symbol: d, Freq: 3, Left: -1, Right -1
5: symbol: f, Freq: 3, Left: -1, Right -1
6: symbol: e, Freq: 4, Left: -1, Right -1
7: symbol: f, Freq: 5, Left: -1, Right -1
8: symbol: 2, Freq: 6, Left: 4, Right 5
9: symbol: 3, Freq: 9, Left: 6, Right 7
10: symbol: 4, Freq: 15, Left: 8, Right 9
f: 11
e: 10
f: 01
d: 00
hp@ubuntu:~/Desktop
当我尝试这样做时:
printf("data[j].sym: %c\n", data[data_size].symbol );insde 注释部分(这是我将值插入元素和符号的最可疑的部分)" 那么我有非常符号的奇怪值是"data[j].sym: f data[j].sym: f data[j].sym: 2 data[j].sym: 3 data[j].sym: 4 "
我不知道为什么它的前两个地方有“f”,应该有“0 1 2 3 4
" not "f f 2 3 4
"