Имеет ли элемент после последнего элемента в связанном списке значение 0?

#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, то цикл не завершится на этом узле.

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