链表的带参数排序,可以通过姓名、成绩进行升序或降序操作

来源:互联网 发布:php foreach 编辑:程序博客网 时间:2024/06/10 02:44

先上效果图:

void main(){    stu * pHeader = creatLink(4);          //创建链表,需要手动输入姓名成绩    sort(pHeader, true, COMPARE_SCORE);    //按照成绩升序排列    outLink(pHeader);                      //控制台上输出链表    clearLink(pHeader);                    //清空链表}

这里写图片描述
红框部分即为成绩升序排列

/*    链表排序,支持带参数的排序,        可以通过改变参数来实现根据成绩排序、根据姓名排序,        并且可以升序降序,如下:  */#define COMPARE_SCORE   0           //比较成绩#define COMPARE_NAME    1           //比较姓名struct stu{    char name[24];    int score;    stu * next;};//所用到的工具方法声明,具体实现见尾部int MyStrCmp(const char * str1, const char * str2);     //比较字符串void swapEle(stu * p0, stu * p2);                       //交换链表元素int cmpEle(stu * s1, stu * s2, int nFlag);              //比较链表元素//  创建链表,并将链表初始化,需要手动输入参数stu * creatLink(int nCount){    stu * pHeader = new stu;    strcpy_s(pHeader->name, "start");    pHeader->next = NULL;    stu * pTemp = pHeader;    cout << "请按照如下格式输入学生信息: 姓名 (回车键) 成绩" << endl;    for (int i = 0; i < nCount; i++)    {        pHeader->next = new stu;        pHeader->next->next = NULL;        pHeader = pHeader->next;        cout << "请输入信息: ";        cin >> pHeader->name;        cin >> pHeader->score;    }    return pTemp;}/*链表升降序,    bAscend为true时升序,为false时降序    nFlag用与传入需要比较的参数,    如COMPARE_SCORE, COMPARE_NAME*/void sort(stu * pHeader, bool bAscend, int nFlag){    int nJudge = bDescend ? 1 : -1;    //nJudge用于决定升降序    if (NULL == pHeader || NULL == pHeader->next || NULL == pHeader->next->next)        return;    stu * pTemp = pHeader;    stu * pEnd = NULL;    stu * p0 = pHeader->next;    stu * p1 = pHeader->next->next;    while (pEnd != p1)    {        while (pEnd != p1)        {            if (nJudge == cmpEle(p0, p1, nFlag))    //敲黑板,划重点,此处使代码更加容易功能扩充和维护                swapEle(pHeader, p1);            pHeader = pHeader->next;            p0 = pHeader->next;            p1 = p0->next;        }        pEnd = p0;        pHeader = pTemp;        p0 = pHeader->next;        p1 = p0->next;    }}//  将链表输出void outLink(stu * pHeader){    pHeader = pHeader->next;    while (NULL != pHeader)    {        cout << pHeader->name << "\t" << pHeader->score << endl;        pHeader = pHeader->next;    }}//  清空链表void clearLink(stu * pHeader){    stu * pTemp = pHeader;    while (NULL != pHeader)    {        pTemp = pHeader->next;        delete pHeader;        pHeader = pTemp;    }    delete pHeader;}/*    工具类方法的实现*///  字符串比较int MyStrCmp(const char * str1, const char * str2){    while (*str1)    {        if (*str1 > *str2)        {            return 1;        }        if (*str1 == *str2)        {            if (*(str1 + 1) == NULL && *(str2 + 1) == NULL)                return 0;            if (*(str1 + 1) != NULL && *(str2 + 1) == NULL)                return 1;            ++str2;            ++str1;            continue;        }        if (*str1 < *str2)        {            return -1;        }    }    return -1;}//  交换链表元素(注意传入链表节点不是连续的,中间有间隔)void swapEle(stu * p0, stu * p2){    stu * p3 = p2->next;    stu * p1 = p0->next;    p0->next = p2;    p2->next = p1;    p1->next = p3;}//  比较链表元素int cmpEle(stu * s1, stu * s2, int nFlag){    int nCtrl = 0;    switch (nFlag)    {    case COMPARE_SCORE:        nCtrl = s1->score > s2->score ? 1 : -1;        break;    case COMPARE_NAME:        nCtrl = MyStrCmp(s1->name, s2->name);    }    return nCtrl;}
阅读全文
1 0
原创粉丝点击