m0_56197713
2021-06-23 22:16
采纳率: 100%
浏览 53

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;
	}
  • 写回答
  • 好问题 提建议
  • 关注问题
  • 收藏
  • 邀请回答

2条回答 默认 最新

  • qzjhjxj 2021-06-24 00:09
    已采纳

    修改如下,供参考:

    #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;
    }
    已采纳该答案
    评论
    解决 1 无用
    打赏 举报
  • qfl_sdu 2021-06-23 22:53

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

    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题