很头痛的链表有关问题

很头痛的链表问题
建立链表都没什么问题,就是到main()程序中,做删除、插入处理时候,输入插入数据
的时候出现问题。如下源程序中,我要求输入删除结点数据data2,在dos屏幕下,我输入一个数据之后,程序并没有直接运行删除子程序依然停留在输入状态下,再输入一个数据才运行下去,结果这个数据影响到下面插入数据的输入,譬如第一个输入是data2,再输入一个数据就直接给插入数据nd1给赋值了,使得最后输出结果出错。不清楚到底是子程序有错还是main()中输入程序出错,请大家指点,帮忙,非常感谢!


源程序如下:

#include   <iostream.h>
#include   <stdio.h>

#define   NULL   0

typedef   int   datatype;

typedef   struct   node{
datatype   info;
node   *next;
}LINKLIST;

LINKLIST   *create(void)
{
datatype   i,data;
LINKLIST   *head,*tail,*node;
head   =   new(LINKLIST);
tail=head;

                  scanf( "%d ",&data);
while(data!=0)
{
node   =   new(LINKLIST);
         
node-> info   =   data;
tail-> next   =   node;
tail   =   node;
                                    scanf( "%d ",&data);

}

tail-> next   =   NULL;
return   head;
}
LINKLIST   *search1(LINKLIST   *head,datatype   x)
{
LINKLIST   *p;
        datatype   i;

i=x;
p   =   head-> next;

while(p   !=   NULL)
{
if(p-> info==i)
{
printf( "查到数据: ");
printf( "%d\n ",p-> info);
return   (p);
}
else
p   =   p-> next;
}
if(p==NULL)
printf( "没有查到该数据 ");
//return   NULL;
}

void   insert(LINKLIST   *p,datatype   x)
{
LINKLIST   *newp=new(LINKLIST);


newp-> info   =   x;
newp-> next   =   p-> next;
p-> next   =   newp;
}
void   del(LINKLIST   *p)//删除单向链表结点*p后面的结点
{
LINKLIST   *temp;
temp   =   p-> next;
p-> next=p-> next-> next;
delete(temp);
}
void   outputlist(LINKLIST   *head)
{
LINKLIST   *current   =   head-> next;

while(current   !=   NULL)
{
printf( "%d\n ",current-> info);
current   =   current-> next;
}
printf( "----------------------------------------\n ");
}

main(void)
{
datatype   data1,data2,nd1;
LINKLIST   *head,*p,*q;

head   =   create();
outputlist(head);            

printf( "要删除的数据: ");
scanf( "%d\n ",&data2);
printf( "data2=   %d ",data2);

p=search1(head,data2);//寻找删除结点位置
printf( "p-> info=   %d\n ",p-> info);
del(p);
outputlist(head);

printf( "要插入的前一个结点info: ");
scanf( "%d\n ",&nd1);
printf( "nd1=   %d\n ",nd1);

                  printf( "要插入的数据: ");
scanf( "%d\n ",&data1);
printf( "data1=   %d\n ",data1);

q=search1(head,nd1);//寻找插入结点位置
printf( "q-> info=   %d\n ",q-> info);    
insert(q,data1);
                  outputlist(head);