一,介绍
说实话,这个排序花了我很长时间去分析,也没人去教,确实比较难搞,主要是理论大家都懂,实际呢,讲细节,原理又模模糊糊的,这次我把我参悟的给发出来
二,代码
typedef struct stu // 结构体取别名为STU
{
int num;
char name[32];
float score;
struct stu *next; // 指针域
} STU;
STU *sort_link(STU *head)
{
if (NULL == head)
{
printf("link not exist\n");
return head;
}
else
{
for (STU *pb = head; pb != NULL; pb = pb->next)
{
for (STU *max = pb, *pf = max->next; pf != NULL; pf = pf->next)
{
if (max->num < pf->num)
{
max = pf;
}
if (max != pb)
{
STU temp = *max; // 交换值
*max = *pb;
*pb = temp;
temp.next = max->next;
max->next = pb->next; // 交换指针
pb->next = temp.next;
}
}
}
printf("链表从大到小排序完成\n");
return head;
}
三,原理
后面就是for循环,一个一个改内容,改指向了, 算是用选择法代入了,里面的内容互换
STU temp = *max; // 交换值
*max = *pb;
*pb = temp;
还是可以理解的
但那个指向互换
temp.next = max->next;
max->next = pb->next; // 交换指针
pb->next = temp.next;
就不是很好理解,如果理解不了,就写一个数组的选择排序,然后往里面套