c语言无法排序指针指向的结构体变量

课程号和成绩为随机数生成的,想要根据课程号来排序,既允许只改变课程号顺序而不改变成绩顺序,如(课程号:50,成绩:60,课程号:24,成绩:70  改为 课程号:24,成绩:60,课程号:50,成绩:70)

也允许根据课程号顺序同时更改成绩顺序。如(课程号:50,成绩:60,课程号:24,成绩:70  改为 课程号:24,成绩:70,课程号:50,成绩:60)

但是为什么我这样写就会显示读取访问权限冲突呢

 

完整代码如下

#include <iostream>
#include <windows.h>
#include <conio.h> 
#include <string>
#include <time.h>
struct conncet	//学生-课程成绩信息
{
	int num_1;		//学号
	int num_2[10];		//课程号
	int grade[10];		//成绩
	struct conncet* next;
};
void jiemian()
{
	int i = 0;
	printf("*********************************************************\n");
	printf("**                                     **\n");
	printf("**          请输入你想要执行的操作:                   **\n");
	printf("**          1:输出学生-课程信息                       **\n");
	printf("*********************************************************\n");

}
void connect(int x)
{
	int i, j, x_1, x_2, temp, a, b;
	conncet* head = NULL, * p1, * p2;
	conncet* head_1;
	p1 = p2 = (conncet*)malloc(sizeof(conncet));
	unsigned int times = (unsigned int)time(NULL);
	for (i = 0; i < x; i++)
	{
		p1->num_1 = i + 1;
		if (i == 0)
		{
			head = p1;
		}
		for (j = 0; j < 10; j++)
		{
			srand(times * ((i + 1) * (j + 1)));
			x_1 = rand() % 50 + 1;
			x_2 = rand() % 40 + 60;
			p1->num_2[j] = x_1;
			p1->grade[j] = x_2;
		}
		p2->next = p1;
		p2 = p1;
		p1 = (conncet*)malloc(sizeof(conncet));
		printf("学号为:%-3d\n", p2->num_1);
		for (j = 0; j < 10; j++)
		{
			printf("课程号为:%-3d", p2->num_2[j]);
			printf("成绩为:%-3d\n", p2->grade[j]);
		}

	}
	p2->next = NULL;
	head_1 = head;
	for (i = 0; i < 10; i++)
	{
		for (j = 0; j < 10 - i - 1; j++)
		{
			if (head_1->num_2[j] > head_1->num_2[j + 1])    //相邻元素之间比较
			{                            //大的元素向右移动
				temp = head_1->num_2[j];          //每一轮比较最大的元素在最后
				head_1->num_2[j] = head_1->num_2[j + 1];
				head_1->num_2[j + 1] = temp;
			}
		}
		head_1 = head_1->next;
	}
}
	int main()
	{
		int num_1 = 1, x;
		int control;
		jiemian();
		scanf("%d", &x);
		switch (x)
		{
		case 1:
			printf("请输入想要生成学生的数量:");
			scanf("%d", &control);
			connect(control);
			break;
		default:
			printf("error\n");
			break;
		}
		return 0;
	}

 

修改如下,供参考:

#include<stdio.h>
#include <iostream>
#include <windows.h>
#include <conio.h>
#include <string>
#include <time.h>
struct conncet	//学生-课程成绩信息
{
	int num_1;		//学号
	int num_2[10];		//课程号
	int grade[10];		//成绩
	struct conncet* next;
};
void jiemian()
{
	int i = 0;
	printf("*********************************************************\n");
	printf("**                                                     **\n");
	printf("**          请输入你想要执行的操作:                   **\n");
	printf("**          1:输出学生-课程信息                       **\n");
	printf("*********************************************************\n");
}
void connect_m(int x)
{
	int i, j, k, x_1, x_2, temp, a, b;
	conncet* head = NULL, * p1, * p2;
	conncet* head_1;
	//p1 = p2 = (conncet*)malloc(sizeof(conncet));
	unsigned int times = (unsigned int)time(NULL);
	for (i = 0; i < x; i++)
	{
                p1 = (struct conncet*)malloc(sizeof(struct conncet));
		p1->num_1 = i + 1;
		if (i == 0)
		{
			head = p2 = p1;
		}
		for (j = 0; j < 10; j++)
		{
			srand(times * ((i + 1) * (j + 1)));
			x_1 = rand() % 50 + 1;
			x_2 = rand() % 40 + 60;
			p1->num_2[j] = x_1;
			p1->grade[j] = x_2;
		}
		p2->next = p1;
		p2 = p1;
		printf("学号为:%-3d\n", p2->num_1);
		for (j = 0; j < 10; j++)
		{
			printf("课程号为:%-3d", p2->num_2[j]);
			printf("成绩为:%-3d\n", p2->grade[j]);
		}
                //p1 = (conncet*)malloc(sizeof(conncet));
	}
	p2->next = NULL;
	head_1 = head;
        for(k=0;k < x;k++){  //对每个学生的循环
         	for (i = 0; i < 10-1; i++)
	        {
		     for (j = 0; j < 10 - i - 1; j++)
		     {
			if (head_1->num_2[j] > head_1->num_2[j + 1])    //相邻元素之间比较
			{                            //大的元素向右移动
				temp = head_1->num_2[j];          //每一轮比较最大的元素在最后
				head_1->num_2[j] = head_1->num_2[j + 1];
				head_1->num_2[j + 1] = temp;
			}
                     }
                }
                printf("\n只改变课程号顺序而不改变成绩顺序,排序完成后:\n");
                printf("学号为:%-3d\n", head_1->num_1);
                for (j = 0; j < 10; j++)
		{
			printf("课程号为:%-3d", head_1->num_2[j]);
			printf("成绩为:%-3d\n", head_1->grade[j]);
		}
                head_1 = head_1->next;
        }

}


int main()
{
		int num_1 = 1, x;
		int control;
		jiemian();
		scanf("%d", &x);
		switch (x)
		{
		case 1:
			printf("请输入想要生成学生的数量:");
			scanf("%d", &control);
			connect_m(control);
			break;
		default:
			printf("error\n");
			break;
		}
      
		return 0;
}

 

排序那(代码第58行),外循环写错了,for(i=0;i<10;i++)改成for(i=0;i<9;i++)