#c #linked-list #quicksort
#c #связанный список #быстрая сортировка
Вопрос:
Я пишу алгоритм быстрой сортировки для домашней работы, но мне было интересно, не остановится ли мой цикл слишком рано. Будет ли цикл while проходить мимо последнего элемента и останавливаться или он продолжит считывать случайные числа, которые остались в памяти? Имеет ли это смысл?
void ListP::partition(ListNode * amp;Larger, ListNode * amp;Smaller, ListNode * amp;pivot ){
ListNode *curr, *temps, *templ; *temps= *templ = NULL;
curr=pivot->next;
pivot->next=NUll;
while(curr!=NULL){
if (curr->item<=pivot->item){
if(Smaller==NULL){
Smaller=curr;
curr=curr->next;
Smaller->next=NULL;
temps=Smaller;
}
else{
temps->next=curr;
curr=curr->next;
temps=temps->next;
temps->next=NUll;
}
}
else{
if(Larger==NULL){
Larger=curr;
curr=curr->next;
Larger->next=NULL;
templ=Larger;
}
else{
templ->next=curr;
curr=curr->next;
templ=templ->next;
templ->next=NUll;
}
}
}
}
Комментарии:
1.
*temps= *templ = NULL;
—> Я в замешательстве. Что должна делать эта строка?2. Что такое
ListP
? Также я не вижу способа, которыйtempl
когда-либо был бы чем-то иным, чемNULL
. Он начинается какNULL
, и вы присваиваете ему значениеLarger
только тогда, когда вы присваиваете ему значениеLarger
, но это происходит только в том случае, еслиNULL
является,,,,!3. «элемент после последнего элемента» такого элемента по определению не может быть. В противном случае то, что вы считали последним элементом, не было бы последним элементом.
4. @scohe001 —
*templ
присваиваетсяNULL
, что, вероятно, уже является ошибкой.templ
неинициализирован (до более поздних версий). Мы не знаем значениеLarger
, переданное вызывающим объектом.5. Это не стандартный класс C
list
, поэтому лучше всего спросить автора, хотя я подозреваю, что любой разумный связанный список был бы установленlast->next
какnullptr
.
Ответ №1:
Имеет ли элемент после последнего элемента в связанном списке значение 0?
По определению, после последнего элемента нет элемента. Если бы после последнего элемента был элемент, то предыдущий не был бы последним.
Мне было интересно, не остановится ли мой цикл слишком рано. Будет ли цикл while проходить мимо последнего элемента
На первый взгляд, все ветви цикла выполняются curr=curr->next
, и условие завершения цикла равно curr!=NULL
, поэтому цикл завершится после узла, next
значение которого равно null. Если next
один из последних узлов вашего списка указывает на null, то цикл не должен проходить мимо него. next
узел перед последним элементом не может указывать на null, поэтому цикл также не должен заканчиваться слишком рано.
Однако, если next
один из последних элементов списка не указывает на null, то цикл не завершится на этом узле.
Вы должны убедиться, что программа ведет себя так, как вы ожидаете, используя отладчик.