2015-10-09 3 views
-2

Итак, у меня есть структура, состоящая из 3 целых чисел. Эта структура представляет собой «строку» моей «таблицы». Таблица в основном представляет собой массив строк, называемый «v». Из-за задачи, которую у меня есть, мне нужно использовать этот формат, а не, например, массив 2d и все это. На данный момент мне нужно «лексикографически сортировать строки» в соответствии с x, y и z. Проблема заключается в функции qsort - она ​​как-то испортила весь мой массив «v», который становится бесполезным. Теперь я не знаю, в чем причина этого. Функция сравнения сравнивает строки в соответствии с x, чем в соответствии с y и чем z (как мне кажется, нормальная лексикографическая сортировка). Функция печати просто печатает таблицу.qsort не работает - беспорядочный массив полностью

#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. Любая помощь была бы с удовольствием оценена, поскольку я совершенно не знаю, почему это происходит. Я пытался решить это на весь день, и я не в курсе. Большое спасибо

+0

Я бы сделал новые vars в верхней части вашей функции 'compare', например' row * row1 = (row *) p1; ', поэтому вам не нужно делать так часто. – turbulencetoo

+0

Почему вы используете 'qsort' в первую очередь? –

+0

Кажется, что ваша функция сравнения слишком сложна, я не думаю, что существует так много возможных разных условий. Кроме того, не помещайте тег с помощью [tag: c], потому что решения будут отличаться в c, и вы, очевидно, используете C++. –

ответ

1

Функция compar не имеет возвращаемого значения в конце. Это приводит к неопределенному поведению.

Вы можете упростить его:

int compar(const void* p1, const void* p2) 
{ 
    row const* row1 = (row const*)p1; 
    row const* row2 = (row const*)p2; 

    if (row1->x != row2->x) 
    { 
     return (row1->x - row2->x); 
    } 

    if (row1->y != row2->y) 
    { 
     return (row1->y - row2->y); 
    } 

    return (row1->z - row2->z); 
} 
+0

В начале тоже ... –

2

Много ваших сравнений имеют = вместо ==, и это приведет к значения копируются в тех местах, где они не должны быть. Если вы установите уровень предупреждения на своем компиляторе достаточно высоким, он должен предупредить вас об этом.