在实现学生成绩(存入很多类型数据,如学号,成绩,课程号等)排序的时候,要根据正序输出。因为在以前做过数组的选择排序,所以本来以为链表差不多,但是在实际操作的时候出现了很多问题。

1.选择排序的原理就是C语言实现结构链表的选择排序

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;
    }//链表的选择排序

还有需求没有实现,任重而道远。

相关文章:

  • 2021-11-27
  • 2021-11-27
  • 2021-11-27
  • 2021-11-27
  • 2021-11-27
  • 2021-11-27
  • 2022-12-23
猜你喜欢
  • 2021-11-27
  • 2021-11-27
  • 2021-06-15
  • 2021-11-27
  • 2021-11-27
  • 2021-11-27
  • 2021-11-27
相关资源
相似解决方案