在实现学生成绩(存入很多类型数据,如学号,成绩,课程号等)排序的时候,要根据正序输出。因为在以前做过数组的选择排序,所以本来以为链表差不多,但是在实际操作的时候出现了很多问题。
1.选择排序的原理就是
2.首先是怎么交换位置,诚然,利用改变指针的指向可以交换节点。但是我觉得可以通过交换结构体的内容,而不动节点本身。
typedef struct student{
int sno;
char sname[10];
char sex;
char major[10];
}Student;
typedef struct course{
int cno1;
char cname1[20];
int classHours1;
int cno2;
char cname2[20];
int classHours2;
int cno3;
char cname3[20];
int classHours3;
}Course;
typedef struct courseGrade{
int sno;
int cno1;
int score1;
int cno2;
int score2;
int cno3;
int score3;
}CourseGrade;
typedef struct allInformation{
struct student student;*student;
struct course course;
struct courseGrade courseGrade;
}AllInformation;
typedef struct linknode{
AllInformation a;
struct linknode *next;
}LinkStNode;//重点,只需要交换'a'
3.在初始化指向结构体的指针时需要赋值 ,否则就成为悬空指针,后果不可预知。
4.第一个for循环对应被比较的指针的移动,第二个for循环对应第二个比较指针的移动。第一个,第二个循环的结束条件都是是pt2!=NULL;
5.注意,指向结构的指针(最外层的结构名)指向内容时,用**‘->’。下层结构用‘.’** 翻译为“的”。
6.一个关键点是,pt1的内容和pt2内容的交换。因为基本思路是不交换节点,只交换节点的内容(之所以结构的嵌套也是为了实现这个思路),所以需要一个p存储pt1的内容(如同所有交换数值的操作)。这个时候p不能是指针。
LinkStNode *p=pt1;//这是错的 LinkStNode p; p.a=pt1->a;//这是对的
因为,如果将这里将pt1赋值给p,相当于将pt1指针赋值给指针p,pt1变化,p也会变化,所以要把p变为结构体而不是指针。
因此,此函数如下
LinkStNode* SortList(LinkStNode* pHeadNode){
LinkStNode* pt1=NULL;
LinkStNode* pt2=NULL;
for(pt1=pHeadNode->next,pt2=pt1->next;
pt2!=NULL;
pt1=pt1->next,pt2=pt1->next
){
for(;pt2!=NULL;pt2=pt2->next){if ((pt1->a.student.sno)>(pt2->a.student.sno)){
LinkStNode p;//LinkStNode*必须初始化时便赋
p.a=pt1->a;
pt1->a=pt2->a;
pt2->a=p.a;}
}
}
return pHeadNode;
}//链表的选择排序
还有需求没有实现,任重而道远。
本文详细探讨了在链表中实现学生成绩排序的过程,包括如何通过交换结构体内容而非节点来实现排序,以及在初始化指向结构体的指针时需要注意的问题。文章还分享了在选择排序过程中遇到的具体挑战和解决方案。
1625

被折叠的 条评论
为什么被折叠?



