新人求问C语言的问题

程序一运行到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;
}


 

 

 

    p=NULL;
    p1=head;
	p2=head->next;
	while(p2!=NULL)
	{
        if(p1->Chinese<p2->Chinese)
		{
            p1->next=p2->next;
            p2->next=p1;
            if(p != NULL)
                p->next=p2;
            //
            p = p2;
            p2 = p1->next;
		}
        else
        {
            p = p1;
            p1 = p2;
            p2 = p2->next; 
        }
    }

tem=p1;

p1=p2;

p2=p1;----这个错了,是p2 = tem啊

再仔细一看,乱套了,把循环指针给修改啦。你应该是交换p1和p2节点的值,而不是交换指针

	p1=head;
	p2=head->next;
	while(p1!=NULL)
	{
		if(p1->Chinese<p2->Chinese)
		{
			p1->next=p2->next;
			p2->next=p1;
			p1->next=p2;
		}
	}

 

您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~

如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

ps: 问答会员年卡【8折】购 ,限时加赠IT实体书,即可 享受50次 有问必答服务,了解详情>>>https://t.csdnimg.cn/RW5m