Сортировочные структуры в C

#c

Вопрос:

Мой вопрос в том, можно ли сортировать структуры в C, используя ту же функцию, но по заданному аргументу?

Мой код приведен ниже:

 struct Process {  int pid;  int at;  int bt;  int completed; }; void sort(struct Process proc[]){  int i, j;  struct Process temp;  for (i = 0; i lt; no_processes-1; i  )  for (j = 0; j lt; no_processes-i-1; j  )  if (proc[j].at gt; proc[j 1].at){  temp=proc[j 1];  proc[j 1]=proc[j];  proc[j]=temp;  } }  

Я имел в виду, что мне нужно использовать одну и ту же функцию сортировки для сортировки данной структуры в зависимости от заданного аргумента, который определяет, следует ли сортировать структуру в соответствии с proc.pid или proc.at или proc.bt .

Возможно ли выполнить вышеуказанную задачу? или мне следует реализовать три функции сортировки?

Комментарии:

1. Тебе не разрешают пользоваться qsort() ? Если вы можете, вам просто нужно написать несколько функций сравнения.

2. Вы можете сделать то, что qsort делает стандартная библиотека, и принять указатель функции (на функцию сравнения) в качестве аргумента

Ответ №1:

На основе переданного вами аргумента вы можете провести соответствующее сравнение, а затем проверить результат сравнения, чтобы узнать, нужно ли вам менять местами.

Например:

 enum { SORT_AT, SORT_BT, SORT_PID };  void sort(struct Process proc[], int sort_by){  int i, j;  struct Process temp;  for (i = 0; i lt; no_processes-1; i  ) {  for (j = 0; j lt; no_processes-i-1; j  ) {  int cmp = 0;  switch (sort_by) {  case SORT_AT:  cmp = (proc[j].at gt; proc[j 1].at); break;  case SORT_BT:  cmp = (proc[j].bt gt; proc[j 1].bt); break;  case SORT_PID:  cmp = (proc[j].pid gt; proc[j 1].pid); break;  }  if (cmp){  temp=proc[j 1];  proc[j 1]=proc[j];  proc[j]=temp;  }  }  } }