Есть большая разница между этими двумя алгоритмами?
Они не делают то же самое, поэтому да, есть большая разница
В вашем коде есть ошибка, которую я считаю классической ошибкой копирования и вставки.Эта строка неверна:
} else if(*(la.elem + j) < *(lb.elem + k)){
*(lc->elem + n) = *(la.elem + k); // ERROR... la.elem should be lb.elem
k--;
} else {
Кроме того, расчет lc->length
отличается.В этом коде из книги:
while(pa >= pa_first)
*pc++ = *pa--;
нет приращения, но в вашем коде
for ( ;j >= 0; j--){
*(lc->elem + n) = *(la.elem + j);
lc->length++;
}
есть.Итак, снова есть разница.Я предполагаю, что книга не права, а вы правы.
Код в книге уменьшает указатель и сравнивает его с указателем на первый элемент.Поскольку уменьшенный указатель в конечном итоге будет указывать перед первым элементом, код имеет неопределенное поведение.
Мой учитель сказал мне, что мой код был нежелательным. Почему?
Aучитель не должен этого говорить .... и учитель должен хотя бы объяснить, почему.
При оценке кода можно сосредоточиться на нескольких вещах:
Функциональностьто есть выполняет ли он то, что должен - это высший приоритет
Производительность, т.е. выполняет ли код с необходимой вам скоростью
Удобство обслуживания, т. Е. Код легко читается, понимается и поддерживается.
Ваш код нелегко прочитать, но, поскольку код в книге неправильный, я будувсе еще предпочитаете ваш код (после исправления ошибки опечатки).
Один простой пример, который вы можете изменить, чтобы повысить читабельность:
*(la.elem + j) --> la.elem[j]
Также обратите внимание, что в книге есть код, который не простчитать.Посмотрите на эту строку из книги:
*pc++ = *pa-- = *pb--;
Как читатель кода, можно только подумать: «что этот код должен делать?»