链表的选择排序问题请教

可以帮我看下这个链表选择排序有什么问题么,输出不来,看上去像是没跳出循环一样(猜测)


//选择排序
void SeleteSort(Student* L)
{
    Student* cur, * pre_cur, * p, * pre;
    pre_cur = L;
    cur = L->next;
    printf("1.represent the chinese:\n");
    printf("2.represent the math:\n");
    printf("3.represent the english:\n");
    int item;
    printf("you choose subject:");
    scanf_s("%d", &item);
    switch (item)
    {
    case 1:
    {
        while (cur)
        {
            pre = cur;
            p = cur->next;
            while (p)
            {
                if (p->chinese > cur->chinese)
                {
                    pre_cur->next = p;
                    p->next = cur->next;
                    pre->next = cur;
                    cur->next = pre->next->next;
                }
                p = pre->next->next;
                pre = pre->next;
            }
            cur = pre_cur->next;
            pre_cur = pre_cur->next;
        }
        break;
    }
    case 2:
    {
        while (cur)
        {
            pre = cur;
            p = cur->next;
            while (p)
            {
                if (p->math > cur->math)
                {
                    pre_cur->next = p;
                    p->next = cur->next;
                    pre->next = cur;
                    cur->next = pre->next->next;
                }
                p = pre->next->next;
                pre = pre->next;
            }
            cur = pre_cur->next;
            pre_cur = pre_cur->next;
        }
        break;
    }
    case 3:
    {
        while (cur)
        {
            pre = cur;
            p = cur->next;
            while (p)
            {
                if (p->english > cur->english)
                {
                    pre_cur->next = p;
                    p->next = cur->next;
                    pre->next = cur;
                    cur->next = pre->next->next;
                }
                p = pre->next->next;
                pre = pre->next;
            }
            cur = pre_cur->next;
            pre_cur = pre_cur->next;
        }
        break;
    }
    }
    ShowList(L);//输出已排序链表
}