LSJ_DL 2021-06-16 16:35 采纳率: 33.3%
浏览 37
已采纳

新人求问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;
}


 

 

  • 写回答

4条回答 默认 最新

  • CSDN专家-link 2021-06-16 18:20
    关注
        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; 
            }
        }
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 树莓派与pix飞控通信
  • ¥15 自动转发微信群信息到另外一个微信群
  • ¥15 outlook无法配置成功
  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题