【发布时间】:2015-10-09 15:34:43
【问题描述】:
所以,我有一个结构,由 3 个整数组成。这个结构代表我的“表”的一个“行”。表基本上是行数组,称为“v”由于我的任务,我需要使用这种格式而不是例如二维数组和这些东西。现在,我需要根据 x、y 和 z “按字典顺序对我的行进行排序”。问题在于 qsort 函数 - 它以某种方式弄乱了我的整个数组“v”,变得无用。我现在不知道是什么原因。 compare 函数根据 x 比较行,而不是根据 y 和 z (我认为是正常的字典排序)。函数打印只是打印表格。
#include <iostream>
#include <stdlib.h>
using namespace std;
struct row {
int x, y, z;
};
int compar(const void* p1, const void* p2){
if(((row*)p1)->x < ((row*)p2)->x){
return -1;
}
if(((row*)p1)->x = ((row*)p2)->x){
if(((row*)p1)->y < ((row*)p2)->y){
return -1;
}
if(((row*)p1)->y = ((row*)p2)->y){
if(((row*)p1)->z < ((row*)p2)->z){
return -1;
}
if(((row*)p1)->z = ((row*)p2)->z){
return 0;
}
if(((row*)p1)->z > ((row*)p2)->z){
return 1;
}
}
if(((row*)p1)->y > ((row*)p2)->y){
return 1;
}
}
if(((row*)p1)->x > ((row*)p2)->x){
return 1;
}
}
void printing(row v[], int p){
cout << "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" << endl;
for (int i = 0; i < p; i++){
cout << v[i].x << " " << v[i].y<< ' ' << v[i].z << endl;
}
cout << "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" << endl;
}
int main(void){
int numOfRows;
cin >> numOfRows; //format of input needs this
row v[numOfRows];
for (int i = 0; i < numOfRows; i++) {
cin >> v[i].x >> v[i].y >> v[i].z;
}
qsort(v,numOfRows,sizeof(row),compar);
printing(v,numOfRows);
}
现在我正在发布带有输出的输入,您可以清楚地看到,有些行在排序过程中重复了,有些行完全丢失了。
3
1 2 3
1 4 5
1 2 4
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
1 2 3
1 2 4
1 2 4
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
下一个输入输出是:
4
100 100 100
100 100 100
100 99 99
99 99 100
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
99 99 99
99 99 99
99 99 99
99 99 100
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
它显然应该是这样的,例如:
3
1 2 3
1 4 5
1 2 4
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
1 2 3
1 2 4
1 4 5
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
这将是我的 qsort 的正确输出。任何帮助将不胜感激,因为我完全不知道为什么会发生这种情况。我整个下午都在努力解决这个问题,但我没有想法。非常感谢
【问题讨论】:
-
我会在你的
compar函数的顶部创建新的变量,比如row *row1 = (row *)p1;,这样你就不必经常转换了。 -
你为什么首先使用
qsort? -
看来你的比较函数太复杂了,我不认为有这么多可能的不同条件。另外,请不要使用c 标记,因为c 中的解决方案会有所不同,而您显然使用的是c++。
-
是的,这是真的,我的错,但是,我认为算法在我的实现中相当简单和正确,不应该影响消失的行,它只是一个正常的字典比较:如果 p1. x 等于 p2.x 试试 y,如果也等于,试试 z,如果不等于,则判断哪个“更小”
-
第二个比较中只有一个 =。这将改变坐标而不是比较它们。