结构数组在排序时给出错误的输出

1)我有一个结构

struct node { char symbol; int freq; int left, right,root; int value; short is_sorted; }; struct node data[1000]; 

其中,通过从文件“Input.txt”作为唯一参数读取以下字母符号(符号)(abcdef)值来获得数据[215] .freq(频率){0,1,2,3,4,5}。现在我必须添加这个数组的两个最小频率,然后定位在同一个数组中获得的新元素,这样它将保持freq的增加顺序(它已经是排序数组,见我们有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中。

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+1f+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 “而不是” ff 2 3 4

所以最后,我自己就完成了:在这里,如果将来有类似的问题,我会为某人编写代码:

 void sort_array(struct node *data, int length) { int i,j; for(i=0;ii;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; } }