程序出现Segmentation fault (core dumped)这是哪里的问题
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct ListData //数据域
{ char name[10]; //姓名
int account; //账号
char password[10]; //密码
float money; //余额
}ListData;
typedef struct node //链表结点
{
ListData data;
struct node *next;
}Link;
void InitList(Link*L)
{
L=(Link*)malloc(sizeof(Link));
L->next=NULL;
} //空链表L的建立1
void InsertList(Link*L) //插入结点进行开户
{ int paiwei=1;
Link *s;
s=(Link*)malloc(sizeof(Link)); //创建新结点a
printf("请输入您开户的姓名:");
scanf("%s",&s->data.name);
s->data.account=100000+paiwei++;
printf("您的开户账号为:%d\n",s->data.account);
printf("请输入您的密码:");
scanf("%s",s->data.password);
s->data.money=0.00;
s->next=NULL;
if(L->next==NULL) //头插法
L->next=s;
else
{
s->next=L->next;
L->next=s;
}
printf("开户成功!\n");
}
void DeleteList(Link*L) //通过删除结点来实现销户功能
{
Link *p=L,*q;
char pass[6];
int s;
printf("请输入您要注销的账号:");
scanf("%d",&s);
printf("请输入账号密码:");
scanf("%s",&pass);
while(p->next!=NULL)
{
if(p->next->data.account==s)
break;
p=p->next;
}
if(p->next!=NULL)
{
while(strcmp(p->next->data.password,pass)!=0)
{printf("密码错误!请重新输入:");
scanf("%s",pass);
}
q=p->next;
p->next=q->next;
free(q);
printf("注销成功!\n");
}
else
printf("您要注销的账户不存在。\n");
}
void PrintList(Link*L) //输出链表来输出用户信息
{
Link*p=L->next;
while(p!=NULL)
{
printf("%s\t",p->data.name);
printf("%d\t%s\t.2f\n",p->data.account,p->data.password,p->data.money);
p=p->next;
}
}
void Deposit(Link*L,Link*p) // 储户存款、取款、查询余额
{
int cq;
float mn;
while(1)
if(p!=NULL)
{ printf("\n1、存款2、取款3、查询余额4、退出账号\n 请输入数字(1-4)选择功能:\n");
scanf("%d",&cq);
if(cq==1){
printf("请输入你的存款金额:");
scanf("%f" ,&mn);
p->data.money=p->data.money+mn;
printf("存款成功!\n");
}
else if(cq==3)
{
printf("你账户的余额为:%.2f\n",p->data.money);
}
else if(cq==4)
{
printf("账号退出成功!\n");
return;
}
else
{printf("请输入取款金额:");
scanf("%f",&mn) ;
if((p->data.money-mn)>=0)
{
p->data.money=p->data.money-mn;
printf("取款成功!\n");
}
else
{
printf("取款失败!\n");
printf("您的余额为:%2fRMB\n",p->data.money);
printf("请输入合适的金额:");
}
}
}
}
void Search(Link*L)// 查找链表实现登录
{Link*p=L->next;
int acc;
char pass[6];
printf("请输入您要登录的账号:");
scanf("%d",&acc);
printf("请输入您的密码");
scanf("%s",&pass);
while(p!=NULL)
{
if(p->data.account==acc)
break;
p=p->next;
}
if(p==NULL)
printf("不存在该账户!\n");
else
{ if(strcmp(p->data.password,pass)==0)
printf("登录成功!\n");
else
{
while(strcmp(p->data.password,pass)!=0)
{
char pa;
printf("密码错误!\n");
printf("按任意键重新输入,Nor退出");
scanf("\n%c",&pa);
if(pa=='n'||pa=='N')
{
system("cls");
return;
}
printf("\n 请重新输入密码:");
scanf("%s",pass);
}
}
Deposit(L,p);
}
}
void menu() //菜单
{
printf("****************欢迎使用活期存蓄账目管理系统*********************\n");
printf("********** 1 .注册账户 *************\n") ;
printf("********** 2 .注销账户 *************\n") ;
printf("********** 3 .进行存款 *************\n") ;
printf("********** 4 .查询账户 *************\n") ;
printf("********** 5 .查看所有账户 *************\n") ;
printf("********** 6 .退出系统 *************\n") ;
}
void choice()
{
Link*L;
InitList(L);
while(1)
{
int m;
char ch;
printf("请选择您的功能:");
scanf("%d",&m);
if(m==6)
break;
system("cls");
switch(m)
{
case 1:InsertList(L);ch=getchar();break;
case 2:DeleteList(L);ch=getchar();break;
case 3:Search(L);ch=getchar();break;
case 4:menu();ch=getchar();break;
case 5:PrintList(L);ch=getchar();break;
default:printf("输入错误!\n");break;
}
}
}
int main()
{
menu();
choice();
}