【问题标题】:Sort long array of structs对长结构数组进行排序
【发布时间】:2015-12-09 07:48:12
【问题描述】:

所以我有一个包含月份和日期的结构数组,我想对其进行排序,以便第一个结构将保存第 1 个月的第 1 天,第二个结构将保存第 1 个月的第 2 天,依此类推。

我试图通过将正确的数组存储在时间数组中然后替换它们来做到这一点。

我的问题是,要执行以下操作,我可以使我的唯一算法崩溃我的提示并给我一个分段错误。到目前为止,我已经很困惑了,不知道我的逻辑是错误的,还是我以一种过于复杂的方式来执行它,以至于程序无法正常工作。

这是我的鳕鱼的功能

void sortData(struct StructData data[], int size){

    int i=0,x=0,z=0,v_day=0,v2_day=0;
    struct StructData temp[sz];

    for (i=0;i!=12;i++){

        for (x=0;x!=12;x++){

            if (data[x].month == i+1){

                for (v=0;v!=31;v++){

                    for(v2=0;v2!=31;v2++){

                        if (data[v2].day == v+1){

                            temporal[z] = data[v2];
                            z=z+1;

                        }
                    }
                }
            } 
        }
    }

    i=0;


    for (i=0;i!=size;i++){
        data[i] = temporal[i];
    }
}

可能有更好的方法来做到这一点,我只是不明白。

【问题讨论】:

  • 这里的Segfault可能是由于超出了数组索引。使用调试器,它会告诉您段错误发生的确切位置。如果您不知道如何使用调试器,那么现在是时候开始学习它了。如果您想要更多答案,请显示更多代码。
  • @Phyreprooph 我虽然是这样,但我怎么能按照该规则对整个结构进行排序呢?我不想只对日子进行排序。我需要对整个结构进行排序,因为它包含特定日期的数据。
  • 你会添加你的结构吗?
  • @MichaelWalz 我将整个功能添加到帖子中。通过“超出键数组索引”,您的意思是我正在使用我没有的变量?如果是这样,我认为这不会是一个问题,因为我正在使用一个'if'语句,只要它不符合要求,它就不应该对变量进行操作。

标签: c arrays sorting struct


【解决方案1】:

您可能希望将 qsort 与类似这样的比较函数一起使用:

int comp (const void * elem1, const void * elem2)
{
    struct StructData f = *((struct StructData*)elem1);
    struct StructData s = *((struct StructData*)elem2);
    if (f.day > s.day) return  1;
    if (f.day < s.day) return -1;
    return 0;
}

请记住,所有这些代码可能都不起作用。很久没有写C代码了,所以这更像是理论代码。基本上,您希望查看数组中的结构并以某种方式比较它们在函数中的值。

【讨论】:

    【解决方案2】:

    如果按天排序相同,则按月排序。使用任何排序算法。

    【讨论】:

    • 我觉得“使用任何排序算法”是问题的核心。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多