我有一个结构体:
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的排序而移动。我该怎么办?
发布于 2013-07-11 22:59:26
不只是交换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-11 23:02:07
您实际上是在对数组进行排序,但只对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/
发布于 2013-07-11 23:05:38
您还必须复制结构中的其他元素。我假设您要编写一个函数来替换元素的值,如下所示:
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]));
}
}https://stackoverflow.com/questions/17596640
复制相似问题