在struct c的数组中排序struct数组

时间:2012-02-26 19:45:18

标签: c arrays data-structures qsort

我正在尝试按结构的每个成员对结构数组进行排序;即,我想要 打印按结构的每个成员排序的1个列表。当成员的 结构是整数,没问题。但其中一个成员是另一组结构, 而且我也希望通过该结构的每个成员对整个混乱进行排序。这是代码:

 #define PROPHET_COUNT 9000
 #define MAX_FAITH_COUNT 600

typedef struct s_ProphetStat {  
    int     precursorScore;
    int     cassandraScore;
    int     prophetId;} prophetStat;

typedef struct s_FaithStat{
    int     precursorScore;
    int     cassandraScore;
    int     faithId;
    prophetStat ProphetStat[PROPHET_COUNT];  } faithStat; 

void fauxScoringFunction(faithStat *FaithStat)
{
    for (int faithIndex = 0; faithIndex < MAX_FAITH_COUNT; ++faithIndex){
        for (int prophetIndex = 0; prophetIndex < PROPHET_COUNT; ++prophetIndex){
            int randomNumber = rand();
            FaithStat[faithIndex].ProphetStat[prophetIndex].precursorScore +=   randomNumber;
            FaithStat[faithIndex].ProphetStat[prophetIndex].cassandraScore +=   randomNumber;
            FaithStat[faithIndex].precursorScore += randomNumber;
            FaithStat[faithIndex].cassandraScore += randomNumber; }}
}

typedef int (*compfn)(const void*, const void*);`enter code here`

   int compareFaithPrecursorScores(faithStat *faithA, faithStat *faithB){
 if (faithA->precursorScore > faithB->precursorScore) return 1; if (faithA->precursorScore < faithB->precursorScore) return -1; return 0; }
    int compareFaithCassandraScores(faithStat *faithA, faithStat *faithB) {
  if (faithA->cassandraScore > faithB->cassandraScore) return 1; if (faithA->cassandraScore < faithB->cassandraScore) return -1; return 0; }
    int cannotFigureOut(...) { return 0; }

void fakemain(void)
{
    faithStat   *FaithStat =  (faithStat *)   calloc(MAX_FAITH_COUNT,   sizeof(faithStat) );
    fauxScoringFunction(FaithStat);
    // sort by cumulative precursorScore for each faith 
    qsort(FaithStat, MAX_FAITH_COUNT, sizeof(faithStat *), (compfn) compareFaithPrecursorScores);
    // print results();
    // sort by cumulative precursorScore for each faith
    qsort(FaithStat, MAX_FAITH_COUNT, sizeof(faithStat *), (compfn) compareFaithCassandraScores);
    // print results()
    // sort by prophet precursor score
    qsort(FaithStat, MAX_FAITH_COUNT * PROPHET_COUNT, sizeof(faithStat *), (compfn) cannotFigureOut);
}

我正在尝试编写“cannotFigureOut()”比较函数。 (我正在使用VS2010 C ++编译C代码(不是我的决定),因此讨厌的calloc演员。所有其他的丑陋都是我的。)

编辑:试图简化,拙劣的比较功能。修正了。也, 编辑:我省略了一条重要的信息:每一个信仰的先知集是相同的。所以我想做的就是排序 每个先知的累积前兆得分(然后,分别由累积的cassandra得分)。那就是:Prophet [0] cumulativeScore =(Faith [0] .Prophet [0] .precursorScore + (Faith [1] .Prophet [0] .precursorScore ... Faith [MAX_FAITH_COUNT - 1] .Prophet [0] .precursorScore);

1 个答案:

答案 0 :(得分:0)

首先,return (a,b);只返回b;在您的compareFaithPrecursorScorescompareFaithCassandraScores中,您可能希望将,替换为-。现在,您只在主管中分配了信仰,因此在最后一个中,您应该对与之前相同长度的FaithStat进行排序:MAX_FAITH_COUNT,而不是{{1 }}。

现在在你的MAX_FAITH_COUNT * PROPHET_COUNT中,您只需比较两个faithStats,就像以前一样,所以签名仍然相同:

cannotFigureOut

(编辑:)好吧,所以(在你的澄清之后)根本没有被称为累积,这是误导。你的意思是得分。您最后添加的内容似乎是要完全排序另一个数组,这次是9000名先知(而不是600个信仰)。每个先知的得分都是他在所有信仰中得分的总和;只需创建一个函数,在创建后填充先知数组,然后像往常一样排序。

您可以使用相同的int cannotFigureOut(faithStat *faithA, faithStat *faithB){ .... } 结构来保存此次总分,而不是每个信仰值,以便签名

prophetStat