Я думаю, что проблема в следующих строках:
head=q;
В то время как логика c того, что вы пытаетесь сделать, это solid проблема здесь в том, что вы меняете значение голова в стеке. Другими словами, то, что вы получаете в этой функции в качестве параметра, является адресом первого элемента списка. Этот адрес помещается в стек, и вы используете его в функции insertbeg.
Теперь вам нужно как-то сообщить коду, вызывающему эту функцию (я думаю, вы обращаетесь к нему в вопрос как водителя) что голова изменилась. Я думаю, что лучший способ сделать это - изменить параметр с n * на n **.
Таким образом, вы получите адрес головки указателя, а не только то, на что он указывает (то есть адрес первого элемента).
Подводя итог, я бы предложил следующие изменения:
1) Измените параметр с n*head
на n **addressOfHead
2) Измените каждое вхождение head
в вашем коде *addressOfHead
Небольшое объяснение того, что мы только что там сделали:
1) Теперь мы передаем адрес переменной, которая содержит адрес первого элемента вместо адреса самого первого элемента. Таким образом, мы можем распространять информацию о новом адресе первого элемента обратно в код, который вызвал функцию.
2) Из-за того, что мы сделали в пункте 1, у нас больше нет параметра head, содержащего адрес первого элемента списка. Тем не менее, мы можем получить этот адрес, сняв ссылку на двойной указатель, который у нас есть. Вот так *addressOfHead
. С этим выражением мы в основном сообщаем компилятору: «Пожалуйста, дайте мне номер, который находится в адресе ячейки памяти по адресу». Это число является адресом первого элемента (то есть главы).
Надеюсь, я мог бы помочь.