1

動的配列リストをソートしようとしていますが、機能せず、どうすればよいかわかりません。これは私がこれまでに行ったことです:

    void ascending_sort(Controller* ctrl)
    {
    int i,j;
    Cost* aux;
    DynamicVector* c=getAllCosts(ctrl);
    for(i=0;i<getLen(c)-1;i++)
    {
        Cost* cost;
        for(j=i+1;j<getLen(c);j++)
        {
            if(cost[i].sum < cost[j].sum)
            {
                    aux=cost[i]; //error
                cost[i]=cost[j];
                cost[j]=aux; //error
            }
        }
    }
}

構造体は次のとおりです。

typedef struct{
    char* day;
    char* type;
    int sum;
}Cost;

どうすれば修正できますか?「Cost* aux」を宣言するとき、何か間違ったことをしていると思います。あなたが私を助けてくれることを願っています!

編集:ソート機能の新しいコードを更新しました。今、私が望むものを印刷しません。「Cost 1」と表示され、それ以外は何も表示されず、すべてを停止する「プログラムの終了」ウィンドウが表示されます。何が問題なのですか?

これは新しいソート アルゴリズムです。

void ascending_sort(Controller* ctrl)
        {
        int i,j;
        DynamicVector* c=getAllCosts(ctrl);
        for(i=0;i<getLen(c)-1;i++)
        {
            Cost* cost=getElementAtPosition(c,i); //returns element on position
            for(j=i+1;j<getLen(c);j++)
            {
                if(cost[i].sum < cost[j].sum)
                {
                const Cost  aux=cost[i];
                            cost[i]=cost[j];
                            cost[j]=aux;
                }
            }
        }
    }

これは印刷機能です: //この機能はコンソールにあります

void PrintCosts(Console* console)
{
    DynamicVector* CostList=getAllCosts(console->ctrl);
    if (getLen(CostList))
    {
        int i;
        for(i=0;i<getLen(CostList);i++)
        {
            printf("\nCost %d\n\n",i+1);
            Cost *c=(Cost*)getElementAtPosition(CostList,i);
            PrintCost(c);
        }

    }
    else printf("No cost in the list!");
}

これは、コントローラーからコンソールへの並べ替え関数を呼び出す関数です。

void AscendingSort(Console* console)
{
    ascending_sort(console->ctrl);
}
4

3 に答える 3

2

Costはい、実際の値が必要なときにポインターを使用しています。最も内側のスコープは次のとおりです。

const Cost aux = cost[i];
cost[i] = cost[j];
cost[j] = aux;

cost、 の配列Cost、およびcタイプDynamicVector *とループで使用する長さの関係がわかりません(または理解できない)ことに注意してください。

また、並べ替えアルゴリズムはあまり良くありません。を使用するだけqsort()です。

于 2013-03-18T12:13:36.740 に答える
1

forCost*の代わりに使用しました。Costaux

于 2013-03-18T12:15:01.330 に答える
0

The revised sorting code is better, but is probably making unwarranted assumptions:

void ascending_sort(Controller* ctrl)
{
    DynamicVector *c = getAllCosts(ctrl);
    for (int i = 0; i < getLen(c)-1; i++)
    {
        Cost *cost = getElementAtPosition(c,i);
        for (int j = i+1; j < getLen(c); j++)
        {
            if (cost[i].sum < cost[j].sum)
            {
                const Cost aux = cost[i];
                cost[i] = cost[j];
                cost[j] = aux;
            }
        }
    }
}

If you need to use getElementAtPosition(c, i), you need to use getElementAtPosition(c, j) to get the second value. That much seems non-controversial to me.

Additionally, if you need the function to get the values, you probably need a function to put the values too.

void ascending_sort(Controller* ctrl)
{
    DynamicVector *c = getAllCosts(ctrl);
    for (int i = 0; i < getLen(c)-1; i++)
    {
        Cost *cost_i = getElementAtPosition(c, i);
        for (int j = i+1; j < getLen(c); j++)
        {
            Cost *cost_j = getElementAtPosition(c, j);
            if (cost_i->sum < cost_j->sum)
                swapElements(c, i, j);
        }
    }
}

Or, maybe:

void ascending_sort(Controller* ctrl)
{
    DynamicVector *c = getAllCosts(ctrl);
    for (int i = 0; i < getLen(c)-1; i++)
    {
        Cost *cost_i = getElementAtPosition(c, i);
        for (int j = i+1; j < getLen(c); j++)
        {
            Cost *cost_j = getElementAtPosition(c, j);
            if (cost_i->sum < cost_j->sum)
            {
                setElementAtPosition(c, i, cost_j);
                setElementAtPosition(c, j, cost_i);
            }
        }
    }
}
于 2013-03-18T16:02:58.980 に答える