【问题标题】:structure array giving wrong output on sorting结构数组在排序时给出错误的输出
【发布时间】: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


【解决方案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;
}
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-26
    • 1970-01-01
    • 2017-06-02
    • 1970-01-01
    • 1970-01-01
    • 2021-07-23
    相关资源
    最近更新 更多