程序一运行到sort函数的第一个for循环就提示 0xC0000005: 读取位置 0x00000030 时发生访问冲突
函数如下
#include <stdio.h>
#include <malloc.h.>
typedef struct STU
{
char name[20];
int ID;
char gender[6];
int Chinese;
int Math;
int English;
int avg;
struct STU *next;
}Stu,*pStu;
pStu create(void);
int ins(pStu head);
int del(pStu head,int id);
void sort(pStu head);
void write(pStu head);
int main()
{
int n;
pStu head=NULL,p1;
printf("欢迎进入学生排序系统\n");
printf("选择要进行的操作(0:退出 1:录入学生信息):");
scanf("%d",&n);
if(n==0)
{
return 0;
}
printf("请输入原始学生信息:\n");
head=create();
printf("是否要继续操作?(0:结束 1:添加学生信息 2:删除学生信息)\n");
scanf("%d",&n);
while(n!=0)
{
switch(n)
{
case 0:
return 0;
case 1:
ins(head);
break;
case 2:
printf("请输入要删除的学生的学号\n");
scanf("%d",&n);
del(head,n);
break;
default:
printf("输入不合法!\n");
break;
}
printf("是否要继续操作?(0:结束 1:添加学生信息 2:删除学生信息)\n");
scanf("%d",&n);
}
sort(head);
p1=head->next;
while(p1)
{
printf("%s%s%d%d%d%d%d\n",p1->name,p1->gender,p1->ID,p1->Chinese,p1->Math,p1->English,p1->avg);
p1=p1->next;
}
return 0;
}
pStu create(void)
{
int m;
char name[20];
int ID;
char gender[6];
int Chinese;
int Math;
int English;
pStu head,p,s;
head=p=(pStu)malloc(sizeof(Stu));
head->next=NULL;
printf("需要添加学生信息吗?(0:结束 1:继续)\n");
scanf("%d",&m);
while(m!=0)
{
s=(pStu)malloc(sizeof(Stu));
printf("请输入姓名:\n");
scanf("%s",s->name);
printf("请输入性别:\n");
scanf("%s",s->gender);
printf("请输入学号:\n");
scanf("%d",&s->ID);
printf("请输入语文成绩:\n");
scanf("%d",&s->Chinese);
printf("请输入数学成绩:\n");
scanf("%d",&s->Math);
printf("请输入英语成绩:\n");
scanf("%d",&s->English);
s->avg=(s->Chinese+s->Math+s->English)/3;
s->next=p->next;
p->next=s;
p=s;
printf("需要添加学生信息吗?(0:结束 1:继续)\n");
scanf("%d",&m);
}
return head;
}
int ins(pStu head)
{
pStu s,p=head;
int ave;
s=(pStu)malloc(sizeof(Stu));
printf("请输入姓名:\n");
scanf("%s",&s->name);
printf("请输入性别:\n");
scanf("%s",s->gender);
printf("请输入学号:\n");
scanf("%d",&s->ID);
printf("请输入语文成绩:\n");
scanf("%d",&s->Chinese);
printf("请输入数学成绩:\n");
scanf("%d",&s->Math);
printf("请输入英语成绩:\n");
scanf("%d",&s->English);
s->avg=((double)(s->Chinese+s->Math+s->English))/3.0;
s->next=p->next;
p->next=s;
printf("插入成功!\n");
return 1;
}
int del(pStu head,int id)
{
pStu q=head,p=head->next;
while(p->ID!=id&&p->next!=NULL)
{
q=p;
p=p->next;
}
if(p->ID!=id)
{
printf("该系统中没有此学生信息!\n");
return -1;
}
else
{
q->next=p->next;
free(p);
printf("删除成功!\n");
}
return 1;
}
void sort(pStu head)
{
pStu p1=NULL,p2=NULL,tem=NULL;
if(head==NULL)
{
return;
}
for(p1=head;p1->next!=NULL;p1=p1->next)
{
for(p2=p1->next;p2!=NULL;p2=p2->next)
{
if(p1->avg<p2->avg)
{
tem=p1;
p1=p2;
p2=p1;
}
}
}
return;
}
void write(pStu head)
{
pStu p1;
FILE *fp;
Stu g;
fp=fopen("学生成绩目录.txt","a+");
p1=head->next;
while(p1)
{
fwrite(p1,sizeof(Stu),1,fp);
p1=p1->next;
}
printf("录入成功!\n");
return;
}