删除动态链表特定结点发生异常,坐等高人指点,如果各亲不仅指出异常还能给出正确的写法那就万分感谢了

删除动态链表特定结点发生错误,坐等高人指点,如果各亲不仅指出错误还能给出正确的写法那就万分感谢了。
#include<iostream.h>
#include<malloc.h>
typedef struct student
{
int m;
struct student *next;
}Node;

Node *creat()//头插法建立动态链表
{
    Node *head,*p1;int flag=1,k;
head=(Node *)malloc(sizeof(Node));head->next=NULL;// 开辟头结点
while(flag)
{
cin>>k;//先判断再建立
if(k!=0)
{
          p1=(Node *)malloc(sizeof(Node));
  p1->m=k;
  p1->next=head->next;
          head->next=p1;
 }
else flag=0;
}
return head;//返回头结点的地址
}

void print(Node *p2)//输出链表
{
    p2=p2->next;
while(p2)
{
cout<<p2->m<<' ';
p2=p2->next;
}

}

void delist(Node *p3,int i)//删除特定结点
{
Node *pre,*r;int k=0;
while(pre->next!=NULL&&k<i-1)
{
pre=pre->next;
k++;
}
    if(!(pre->next))
{
cout<<"删除结点的位置不合理";
}
r=pre->next;
pre->next=r->next;
free(r);
}
main()
{  Node *pt;
   pt=creat();
   print(pt);
   delist(pt,2);
   print(pt);
}

------解决方案--------------------
删除里面 pre 指向哪里啊?
------解决方案--------------------
delist函数添加返回值,返回0表示删除成功,返回1表示位置不存在,然后再main函数里判断返回值,如果是1就重新接受输入。
------解决方案--------------------
引用:
当输入的插入位置不合理时怎么重新输入呀?用goto吗?
怎么写啊,求大神指点。
可以使用try{}catch(){},try插入,catch是否插入正确,最后重新输入。或者你用其他的逻辑写返回值判断,如5楼所说。一般不推荐使用goto