2015-12-09 4 views
1

Итак, у меня есть массив структур с месяцами и днями на нем, и я хочу отсортировать его так, чтобы первая структура провела день 1 месяца 1, второй день 2 месяца 1 и так далее.Сортировка длинного массива структур

Я пытаюсь сделать это, сохранив правильный массив во временном массиве и затем заменив его.

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

Вот функция с моей трески

void sortData(struct StructData data[], int size){ 

    int i=0,x=0,z=0,v_day=0,v2_day=0; 
    struct StructData temp[sz]; 

    for (i=0;i!=12;i++){ 

     for (x=0;x!=12;x++){ 

      if (data[x].month == i+1){ 

       for (v=0;v!=31;v++){ 

        for(v2=0;v2!=31;v2++){ 

         if (data[v2].day == v+1){ 

          temporal[z] = data[v2]; 
          z=z+1; 

         } 
        } 
       } 
      } 
     } 
    } 

    i=0; 


    for (i=0;i!=size;i++){ 
     data[i] = temporal[i]; 
    } 
} 

Существует, вероятно, лучший способ сделать это, я просто не вижу.

+0

Попробуйте возиться с qsort: http://stackoverflow.com/questions/1787996/c-library-function-to-do-sort – Phyreprooph

+0

Segfault здесь, вероятно, связано с отсутствием индексов связанных массивов. Используйте отладчик, который скажет вам, где именно происходит segfault. Если вы не знаете, как использовать отладчик, тогда пришло время начать изучать его сейчас. Покажите больше кода, если вы хотите получить больше ответов. –

+0

@Phyreprooph Я, хотя так, но как я мог бы отсортировать всю структуру по этому правилу? Я не хочу сортировать только дни. Мне нужна вся структура, отсортированная по мере того, как она хранит данные того конкретного дня. – hydrz

ответ

1

Вы, вероятно, хотите использовать QSort с функцией сравнения что-то вроде этого:

int comp (const void * elem1, const void * elem2) 
{ 
    struct StructData f = *((struct StructData*)elem1); 
    struct StructData s = *((struct StructData*)elem2); 
    if (f.day > s.day) return 1; 
    if (f.day < s.day) return -1; 
    return 0; 
} 

Имейте в виду, что весь этот код, вероятно, не будет работать. Не написал C-код в течение длительного времени, так что это больше похоже на теоретический код. В основном вы хотите смотреть на структуры из массива и каким-то образом сравнивать их значения внутри функции.

-1

Сортировка по месяцам, если они одинаковы по дням. Используйте любой сортирующий алгоритм.

+1

Я вроде чувствую, что «использовать любой сортирующий алго» - это вопрос. – djechlin

Смежные вопросы