【发布时间】:2014-02-13 05:38:53
【问题描述】:
1)我有一个结构
struct node
{
char symbol;
int freq;
int left, right,root;
int value;
short is_sorted;
};
struct node data[1000];
其中 data[215].freq (frequency) {0,1,2,3,4,5} 是通过从文件“Input.txt”中读取以下字母符号 (symbol) (abcdef) 值作为唯一的论点。现在我必须添加这个数组的两个最小频率,然后将获得的新元素定位在同一个数组中,这样它将保持频率的递增顺序(它已经排序数组,看到我们有 0,1, 2,3,4,5)。
(2)我还要注意,最小添加的两个元素不能再参与排序和添加,如果已经添加,必须固定一次,但是添加新获得的元素可以参与添加并再次排序。 eg:我们将两个最小元素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”而不是“f f 2 3 4”
【问题讨论】:
-
您是否在调试器中运行了这段代码,并在代码的问题区域放置了断点?
-
@ryyker 谢谢回复。我正在使用记事本++,记事本++中没有什么要调试的。但我确信问题出在我写的部分“/下面是错误输出最可疑的部分/////”,我从早上开始就试图修复它,现在是晚上。仍然无法要做,请帮帮我
-
如果您的代码编译但给出了错误的结果,则有 需要调试。即使是
printf调试。如果您在类似 nix 的系统上工作,您至少也可以通过gdb运行它。 -
@luk32 是的,我尝试使用“printf”检查输出(即使您可以看到注释的 printf),但是这些值非常奇怪,我无法理解为什么它会给出这样的 strance值。例如,如果我取消注释“ printf("data[j].sym2: %c\n", data[data_size].symbol );"然后我有一个非常奇怪的符号值,它是 "data[j].sym2: f data[j].sym2: f data[j].sym2: 2 data[j].sym2: 3 data[j].sym2: 4 "我不知道为什么前两个位置有"f",应该是"0 1 2 3 4"而不是"ff 2 3 4"
-
@ryyker 你知道我的代码有什么问题吗?我仍然无法解决它。
标签: c arrays algorithm sorting structure