1

私は構造体を持っています:

struct points{
int i;
int x;
int y;
};

そして、構造体の配列を作成し、その中に要素を入れました。i 要素は、ある点のラベルを示します。配列の入力として 1 2 3 があるとします。1 は点 (2, 3) のラベルに対応します。次に、 x 要素を並べ替えようとしました:

for (a=0; a < i; a++){
                    for (b = 0; b < i; b++){
                        if (pt[b].x > pt[b+1].x){
                        temp1 = pt[b].x;
                        pt[b].x = pt[b+1].x;
                        pt[b+1].x = temp1;
                        }                       
                    }                               
                }

正しくソートされました。i(ラベル)を印刷すると、ソート時に x 要素に対応しませんでした。つまり、 x 要素だけが移動しました。i と y を並べ替えたまま x と一緒に動かしたいです。私は何をすべきか?

4

3 に答える 3

1

実際には配列をソートしていますが、構造全体ではなく i の値のみです!

qsortここでは C を使用します。

#include <stdlib.h>
#include <stdio.h>

struct points
{
    int i;
    int x;
    int y;
};

int compare(const struct points *a, const struct points *b)
{
    if (a->i < b->i) return -1;
    if (a->i == b->i) return 0;
    if (a->i > b->i) return 1;
}

int main(void)
{
    int i;
    struct points p[3] = { { 4, 2, 1 }, { 1, 3, 5 }, { 2, 8, 1 } };

    qsort(p, 3, sizeof(struct points), 
        (int (*)(const void*, const void*)) compare);

    printf("{ ");   
    for (i=0; i<3; ++i) 
    {
        printf("{ %d, %d, %d }", p[i].i, p[i].x, p[i].y);
        if (i < 2) printf(", ");
    }
    printf(" }\n");
}

http://www.cplusplus.com/reference/cstdlib/qsort/を参照してください。

于 2013-07-11T15:02:06.917 に答える
1

単にスワップするのではなくx、構造体の配列全体がソートされるようにすべてのデータをスワップする必要があります。

わかりやすくするために、別の関数でこれを行うことができます。

void swap_points(struct points *pa, struct points *pb)
{
  const struct points tmp = *pa;
  *pa = *pb;
  *pb = tmp;
}

次に、並べ替えのコードの最も内側の 3 行の代わりにそれを呼び出します。

あなたは本当にqsort()これを行うために使用する必要があります.それははるかに簡単です:

static int compare_points(const void *va, const void *vb)
{
  const struct points *pa = va, *pb = vb;

  return pa->i < pb->i ? -1 : pa->i > pb->i;
}

qsort(pt, i, sizeof pt[0], compare_points);
于 2013-07-11T14:59:25.807 に答える
0

構造体の他の要素もコピーする必要があります。次のように、要素の値を置き換える関数を書くとします。

void copyPoints(point1* a, point2* b)
{
    int temp = a->i;
    a->i = b->i;
    b->i = temp;
    temp = a->x;
    a->x = b->x;
    b->x = temp;
    temp = a->y;
    a->y = b->y;
    b->y = temp;
}

次に、次のようにコードを変更します。

for (a=0; a < i; a++)
{
    for (b = 0; b < i; b++)
    {
        if (pt[b].x > pt[b+1].x)
            copyPoints(&(pt[b]),&(pt[b+1]));  
    }                               
}
于 2013-07-11T15:05:38.273 に答える