Первый 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;
также должно работать без изменения цикла.