При n=1 создаётся список из 1 элемента, и q2 не инициализируется. Но при удалении всё равно вызывается delete q2. Программа либо не скомпилируется (если компилятор достаточно умный), либо упадёт в segfault.
Вот так должно работать:
if(!k){
q1 = q0;
for(i=1;i<=n;i++){
q2=q1->p;
delete q1;
q1=q2;
}
}
А еще неплохо проверять на нулевые и отрицательные n; а также то, что new вернул валидный указатель.