在struct中对元素进行排序

时间:2013-07-11 14:51:47

标签: c sorting struct

我有一个结构:

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,因为它已经排序了。我该怎么办?

3 个答案:

答案 0 :(得分: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);

答案 1 :(得分:1)

您实际上是对数组进行排序,但只是i的值,而不是整个结构!

你想在这里使用C qsort

#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/

答案 2 :(得分: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]));  
    }                               
}