用c写的活期储蓄的程序运行出现发生访问冲突下面为代码请高手指教。

/*用c写的活期储蓄的程序运行出现提示0xC0000005: 读取位置 0xcccccccc 时发生访问冲突下面为代码请高手指教。是不是把链表保存成文件那里有错误?*/

#define _CRT_SECURE_NO_WARNINGS
/* 活期储蓄处理中,储户开户、销户、存入、支出活动频繁。设计一个活期储蓄账目管理系统。
【基本要求】
1) 能比较迅速地找到储户的帐户,以实现存款、取款记账;
2) 能比较简单,迅速地实现插入和删除,以实现开户和销户的需要。*/
#include
#include
#include
#include

int total = 0; //定义的全局变量,用于开户所需
typedef struct listdata //定义结构体
{
char name[20];//用户姓名
int account;//用户账户
char password[15];//用户密码
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
}
void InsertList(LINK *L) //链表插入实现开户功能
{
LINK *s;
s = (LINK
)malloc(sizeof(LINK));//建立新节点s
printf("请输入你要开户的姓名(20字符以内):");
scanf("%s", s->data.name);
s->data.account = 100000 + total++;
printf("\n你开户的账号为:%d\n", s->data.account);
printf("请输入你账号的密码(15位数以内):");
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;//将s节点插入表头
L->next = s;
}
printf("开户成功!\n");
}
void DeleteList(LINK*L) //链表删除实现销户功能(需要账号和密码)
{
LINK *p = L, *q;
char pass[15];
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("\n请选择:(1)、存款(2)、取款(3)、查询余额(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("请输入你的取款金额:");
        FH:
            scanf("%f", &mn);
            if ((p->data.money - mn) >= 0)
            {
                p->data.money = p->data.money - mn;
                printf("取款成功!\n");
            }
            else
            {
                printf("取款失败!\n");
                printf("你账户上的金额不足!\n你的账户余额为:%.f\n", p->data.money);
                printf("请输入合适的取款金额:");
                goto FH;
            }
        }
    }
}

}
void Search(LINK L) //链表查找,实现用户登陆功能
{
LINK *p = L->next;
int acc;
char pass[15];
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("是否重新输入(是,就输入任意键)、(否,从键盘上输入N or n):");
scanf("\n%c", &pa);
if (pa == 'n' || pa == 'N')
{
system("cls"); return;
}
printf("\n请重新输入你的密码:");
scanf("%s", pass );
}
}
Deposit(L, p);
}
}
void save(LINK *L) //保存链表,实现用户信息保存到文件
{
LINK *P;
FILE *fp;
if ((fp = fopen("D:\vs\node.text", "wb")) == NULL)
{
printf("Cannot open file.\n");
exit(1);
}
LINK *p = L->next;
while (p != NULL)
{
if (fwrite(p, sizeof(struct node), 1, fp) != 1)
printf("file write error.\n");
p = p->next;
}
fclose(fp);
}
void Print(LINK *L) //打开文件,得到链表
{
FILE *fp;
LINK *p=NULL, *s;
if ((fp = fopen("D:\vs\node.text", "rb")) == NULL)
{
printf("无法读取文件!\n");
exit(1);
}
s = (LINK
)malloc(sizeof(LINK));
s->next = NULL;
while (fread(s, sizeof(struct node), 1, fp))
{
total++; //用于记录账号的,以致账号不重复
if (L->next == NULL)
{
L->next = s;
p = s;
p->next = s->next;
}
else
{
p->next = s;
p = s;
p->next = s->next;
}
s = (LINK*)malloc(sizeof(LINK));
s->next = NULL;
}
fclose(fp);
}
void menu() //主菜单函数
{
printf("\t************欢迎进入活期储蓄账目管理系统***********\n");
printf("\t 1.储户开户 \n");
printf("\t 2.储户销户 \n");
printf("\t 3.储户的账号存款、取款 \n");
printf("\t 4.查看所有储蓄账户信息 \n");
printf("\t 5.退出账目管理 \n");
printf("\t***************************************************\n");
}
void choice() //菜单选择函数
{
LINK *L=NULL;
InitList(L);
while (1)
{
int x;
char ch;
printf("请选择你需要的功能:");
scanf("%d", &x);
if (x>5)
printf("输入有误,请重新选择操作:\n");
if (x == 5)
break;
system("cls");
switch (x)
{
case 1:InsertList(L); ch = getchar(); break;
case 2:DeleteList(L); ch = getchar(); break;
case 3:Search(L); ch = getchar(); break;
case 4:PrintList(L); ch = getchar(); break;
default:break;
}
}
save(L);
}
void main()
{
menu();
choice();
}

2个回答

大概可能是你指针使用出了问题,指针越界,或者是数组越界之类的。

main函数里面这样写:

LINK *L=NULL;
InitList(L);

导致执行完之后,L还是NULL。可以把InitList改为类似下面的

InitList(&L);
void InitList(LINK **pL) //建立空链表
{
*pL = (LINK *)malloc(sizeof(LINK));//建立头结点
*pL->next = NULL;//建立空的单链表L
}

另外,这两处也不一致:
case 3:Search(L); ch = getchar(); break;
void Search(LINK L) //链表查找,实现用户登陆功能

其他地方没细看了

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问