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”读取以下字母符号(符号)(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 abnd 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。< / p>
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
”而不是“f f 2 3 4
”
答案 0 :(得分:1)
所以最后,我自己就完成了:在这里,如果将来有类似的问题,我会为某人编写代码:
void sort_array(struct node *data, int length)
{
int i,j;
for(i=0;i<length-1 && data[i].freq<=data[length-1].freq;i++); //This loop breaks when it gets the desired position, So complexity is about n-1 for total n elements.
for(j=length-1;j>i;j--)
{
struct node temp;
temp.symbol=data[j].symbol;
temp.freq=data[j].freq;
temp.left=data[j].left;
temp.right=data[j].right;
temp.value=data[j].value;
data[j].symbol=data[j-1].symbol;
data[j].freq=data[j-1].freq;
data[j].left=data[j-1].left;
data[j].right=data[j-1].right;
data[j].value=data[j-1].value;
data[j-1].symbol=temp.symbol;
data[j-1].freq=temp.freq;
data[j-1].left=temp.left;
data[j-1].right=temp.right;
data[j-1].value=temp.value;
}
}