Вставка узла в n-й позиции в связанном списке

Другой вариант, предложенный здесь здесь , устанавливает стиль изображения как style="display: block;"

-2
задан balki 15 January 2019 в 21:44
поделиться

2 ответа

Первый insert(2,1) работает нормально. Итак, у вас есть связанный список, подобный этому

(2)->NULL
 |
head

Во второй вставке, давайте следовать за кодом,

1. else 
2. {
3.    node* ptr = head;
4.    for (int i = 1; i <= n - 1; i++)
5.        ptr = ptr->link;
6.    temp->link = ptr->link;
7.    ptr->link = temp;
8. }

Строка 3, ptr указывает на head. n равно 2

(2)->NULL
 |
head
 |
ptr

Строка 4, 1 <= (2-1) - true, потому что 1 == 1, поэтому для цикла выполняется один раз

Строка 5, ptr перемещается на один шаг, поэтому он указывает на NULL

(2)->NULL
 |    |
head  |
      |
     ptr

Строка 6, называется ptr->link, то есть NULL->link. Так что он падает здесь.


Когда вы делаете for(int i=0;i<n-2;i++), n равно 2, поэтому 0 < (2-2) равно false, поэтому работает нормально. Примечание. Работает только в том случае, если вызовы вставок выполняются в порядке, подобном вашему примеру. Если они вызваны в неправильном порядке, это не сработает.

Изменение строки 6 на temp->link = ptr; также должно работать без изменения цикла.

0
ответ дан balki 15 January 2019 в 21:44
поделиться

«Вставка узла в n-ю позицию в связанном списке»:

Используйте std::list вместо того, чтобы свернуть свое собственное. Затем используйте std :: list :: insert .

Кроме того, рассмотрите просто использование вместо std:: vector. Список представляет собой ужасную (отслеживание указателя, создание кеша) структуру данных, которую можно использовать на современных процессорах. A std::vector почти всегда побьет его (независимо от того, что ваши учебники говорят о теоретической эффективности).

0
ответ дан Jesper Juhl 15 January 2019 в 21:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: