#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; } } } }