【发布时间】:2019-11-29 04:09:32
【问题描述】:
我有一个结构,它包含 3 个整数,每个整数类似于三角形一侧的大小:
struct triangle{
int a; int b; int c;
};
typedef struct triangle tri;
我首先需要读取三角形的数量(n)。然后我读取了 n 个三角形的 3 条边,并按照三角形的面积从小到大对它们进行排序。
现在我的想法是比较这些区域,如果前者的面积大于后者,我就交换相应的结构。最后,结构体(边)的值会从小到大打印输出。
我一直在交换结构。到目前为止,我已经这样做了:
void swap(tri *a, tri *b)
{
tri t;
t = *a;
*a = *b;
*b = t;
}
void sort_by_area(tri *tr, int n)
{
int sorted, storage[n];
for(int i = 0; i <= n-1; i++)
{
storage[i] = give_area(&tr[i]);
}
do
{
sorted = 1;
for(int i = 0; i < n-1; i++)
{
if(storage[i] > storage[i+1])
{
/*swap(tr[i].a, tr[i+1].a);
swap(tr[i]->b, tr[i+1]->b);
swap(tr[i]->c, tr[i+1]->c);*/
/*the commented section was my another attempt in which I would change the swap inputs to swap(int a, int b) or swap(int *a, int *b)*/
swap(&tr[i], &tr[i+1]);
sorted = 0;
}
}
}while(!sorted);
}
我确定我在放入结构时绝对是完全错误的。
如果需要更多,这是我的主要功能:
int main()
{
int n;
scanf("%d\n", &n);
tri *tr = malloc(n*(sizeof(tri)));
for(int i = 0; i < n; i++){
scanf("%d %d %d", &tr[i].a, &tr[i].b, &tr[i].c);
}
sort_by_area(tr, n);
for(int i = 0; i < n; i++){
printf("\n%d %d %d", tr[i].a, tr[i].b, tr[i].c);
}
free(tr);
return 0;
}
根据我的调查,代码可以正常工作,我认为主要问题在于交换函数或运行交换函数的嵌套 (for/if) 循环。
【问题讨论】:
-
如果不确定编写一个简单的测试程序,只需使用定义的输入进行一次交换并打印结果。
-
我同意@alk,而且根据this,交换功能看起来还可以。交换结构后,
storage会发生什么? -
@xing 正确!我发布了一个答案来证明你的观点,如果你有时间看看! :)
-
@gsamaras 我猜存储会造成“内存泄漏”?...或者?
-
@alk 我按照你的建议试过了,效果很好,结构中的所有变量都被交换了。
标签: c pointers struct swap bubble-sort