Другой вариант, предложенный здесь здесь , устанавливает стиль изображения как style="display: block;"
Первый 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;
также должно работать без изменения цикла.
«Вставка узла в n-ю позицию в связанном списке»:
Используйте std::list
вместо того, чтобы свернуть свое собственное. Затем используйте std :: list :: insert .
Кроме того, рассмотрите просто использование вместо std:: vector
. Список представляет собой ужасную (отслеживание указателя, создание кеша) структуру данных, которую можно использовать на современных процессорах. A std::vector
почти всегда побьет его (независимо от того, что ваши учебники говорят о теоретической эффективности).