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

您不仅x需要交换所有数据,还需要交换所有数据,以便对整个结构数组进行排序。

为清楚起见,您可以使用单独的函数执行此操作:

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

然后调用它而不是排序中最里面的三行代码。

你真的应该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 回答
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 回答
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 回答