求告知一下,为什么我这个代码明明是对的,然后运行的时候去执行会闪一下就没了

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

#define MAXLEN 100 //定义字符常量

typedef int DataType;//指定DataType的数据类型为int类型
typedef struct linknode //单链表存储类型
{
DataType data; //定义结点的数据域
struct linknode *next; //定义结点的指针域
}LinkList;

void Menu() //菜单显示
{
system("cls");
printf("\n顺 序 表 菜 单\n");
printf("|\n");
printf("| \t1.建立|\n");
printf("| \t2.插入|\n");
printf("| \t3.删除|\n");
printf("| \t4.按位置查找|\n");
printf("| \t5.按元素值查找|\n");
printf("| \t6.求表长\n");
printf("| \t0.退出\n");
printf("|\n");
printf("\n\n");
printf("请输入菜单选项:");
}

LinkList *InitList()
{ //初始化链表函数
LinkList head;
head=(LinkList
)malloc(sizeof(LinkList));//动态分配一个节点空间
head->next=NULL;
return head;//头结点L指针域为空,表示空链表
}

void CreateListH(LinkList *head,int n)
{ //头插法建立链表函数
LinkList *s;
int i;
printf("请输入%d个整数: ",n);
for(i=0;i<n;i++)
{ s=(LinkList *)malloc(sizeof(LinkList));//生成新结点
scanf("%d",&s->data);//读入新结点的数据域
s->next=head->next;//将新结点的指针域存放头节点的指针域
head->next=s;//将新接点插入头结点之后
}
printf("建立链表操作成功!");
}

void CreateListL(LinkList *head,int n)
{ //尾插法建立链表函数
LinkList *s,*last;
int i;
last=head;//*last始终指向尾结点
printf("请输入%d个整数:",n);
for(i=0;i<n;i++)
{
s=(LinkList *)malloc(sizeof(LinkList));//生成新的结点
scanf("%d",&s->data);//读入新结点的数据域
s->next=NULL;//将新结点的指针域为空
last->next=s;//将新结点插入表尾
last=s; //将last指针指向表尾结点
}
printf("建立链表操作成功!");
}

int LengthList(LinkList *head)
{ //求链表长度函数
LinkList *p=head->next;
int j=0;
while(p!=NULL)
{
p=p->next;
j++;
}
return j;
}

void Locate(LinkList *head,DataType x)
{ //在链表中查找值为x的元素位置
int j=1;//计数器
LinkList *p;
p=head->next;
while(p!=NULL && p->data!=x)//查找及定位
{ p=p->next;
j++;
}
if(p!=NULL)
printf("在表的第%d位找到值为%d的结点!",j,x);
else
printf("未找到值为%d的结点!",x);
}

void SearchList(LinkList *head,int i)
{ //在链表中按照位置查找元素
LinkList *p;
int j=0;
p=head;//p指向链表的头结点
if(i>LengthList(head))
printf("位置错误,链表中没有该位置!");
while(p->next!=NULL&&j<i)
{
p=p->next;
j++;
}
if(j==i)//判断与给定的序号是否相等
printf("在第%d位上的元素的值为%d! ",i,p->data);
}

void InsList(LinkList *head,int i,DataType x)
{ //按照位置插入元素
int j=0;
LinkList *p,*s;
p=head;
if(i<1||i>LengthList(head))
printf("\n\n插入位置有误,链表没有该位置");
else
{while(p->next!=NULL&&j<i-1)//定位插入点
{
p=p->next;
j++;
}
if(p!=NULL)//p不为空则将新结点插到p后
{
s=(LinkList *)malloc(sizeof(LinkList));//生成新结点s
s->data=x;//将数据x放入新结点的数据域
s->next=p->next;//将新结点s的指针域域p结点后面元素相连
p->next=s;//将p与新结点s链接
printf("插入元素成功!");
}
else
printf("插入元素失败");
}
}

void DelList(LinkList *head,int i)
{ //按位置删除链表中元素的函数
int j=0;
DataType x;
LinkList *p=head,*s;
while(p->next!=NULL&&j<i-1)//定位插入点
{
p=p->next;
j++;
}
if(p->next!=NULL&&j==i-1)
{
s=p->next;//q为要删除结点
x=s->data;//将要删除的数据放入指针变量x中
p->next=s->next;//将p结点的指针域与q结点后面的元素相连
free(s);
printf("删除第%d位上的元素%d成功!",i,x);
}
else
printf("删除结点的位置错误,删除失败!");
}

void DispList(LinkList *head)
{ //显示输出链表的函数
LinkList *p;
p=head->next;//p指针指向链表第一个结点
while(p!=NULL)//当p指针不为空时输出链表每个数据域值
{
printf("%5d",p->data);
p=p->next;
}
}

main()
{
LinkList *head;
DataType x;
int i,n;
char ch1,ch2,a;
ch1='y';
while(ch1=='y'||ch1=='Y'){
Menu();
scanf("%c",&ch2);
getchar();
switch(ch2){
case '1':
head=InitList();
printf("请输入要建立线性表的长度:");
scanf("%d",&n);
CreateListL(head,n);
printf("建立后的线性表为:\n");
DispList(head);
break;
case '2':
printf("请输入要插入的元素的位置:");
scanf("%d",&i);
getchar();
printf("请输入要插入的元素值:");
scanf("%d",&x);
InsList(head,i,x);
printf("插入元素%d后的线性表为:\n",x);
DispList(head);
break;
case '3':
printf("请输入要删除的元素的位置:");
scanf("%d",&i);
DelList(head,i);
InsList(head,i,x);
printf("插入元素%d后的线性表为:\n",x);
DispList(head);
break;
case '4':
printf("请输入要查找的元素的位置:");
scanf("%d",&i);
SearchList(head,i);
break;
case '5':
printf("请输入要查找的元素:");
scanf("%d",&x);
Locate(head,x);
break;
case '6':
printf("该线性表长度为%d",LengthList(head));
break;
case '0':
ch1='n';
break;
default:
printf("输入有误,请输入0-6进行选择!");
}
if(ch2!='0'){
printf("\n按回车键继续,按任意键返回主菜单!\n");
a=getchar();
if(a!='\xA'){
getchar();
ch1='n';
}
}
}
}

我试了一下你的代码,试了插入、删除,都能正常运行。你的具体问题是什么?