C语言实现结构链表的选择排序

本文详细探讨了在链表中实现学生成绩排序的过程,包括如何通过交换结构体内容而非节点来实现排序,以及在初始化指向结构体的指针时需要注意的问题。文章还分享了在选择排序过程中遇到的具体挑战和解决方案。

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

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

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值