我有一个结构:
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,因为它已经排序了。我该怎么办?
答案 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");
}
答案 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]));
}
}