链表排序之冒泡排序

结构体参考《数据结构与算法分析-c语言描述》

typedef struct node *PtrToNode;
typedef PtrToNode List;
typedef PtrToNode Position;

struct _data{
    char *name;
    int ChineseScores;
    int MathScores;
};
struct node
{
    struct _data data;
    Position next;
};

冒泡排序:遍历元素,依次比较相邻两个元素,小的放在前面;稳定性稳定,乱序时效率差。最坏时间复杂度O(n2),最好时间复杂度O(n);
冒泡排序的特点:每一次遍历都会将最大元素或最小元素放在末尾,因此每多一次遍历少一个元素;
已排好序的标志,即遍历后未发生元素交换。

以下代码是对学生语文和数学成绩的排序,以语文成绩为第一优先级,语文成绩相等时再比较数学成绩。

List ScoresSorting(List L){
    if(L == NULL || L->next == NULL)
        return L;
    Position p = L;
    bool isChange = true;
    while(p && isChange){
        Position q = L;
        isChange = false;
        for(;q->next && q->next != p;q = q->next){
            if(q->next->data.ChineseScores > q->data.ChineseScores || (q->next->data.ChineseScores == q->data.ChineseScores && q->next->data.MathScores > q->data.MathScores)){
                swap(q,q->next);
                isChange = true;
            }
        }
        p = q;
    }
    return L;
}

易错点总结-字符指针:
1.结构体中存在char *成员,字符指针在结构体中只会分配一个指针的内存,不能直接使用;
2.字符指针在scanf前一定要使用malloc动态申请合适的内存,否则再次访问char *时,程序会崩溃;使用完记得释放。
3.字符指针使用时尽量使用字符串处理函数。

你可能感兴趣的:(c链表排序,c,排序,字符指针,scanf)