| 本帖最后由 鸦领主 于 2021-1-22 14:35 编辑 
 1.MFC类库(CList类)链表的使用(MFC是vs编译器特有类库)
 
 <>是模板的意思,里面是你要存储的对象的类型,
 
 
 MFC类库使用 CList类表外排序   改成共享dll,Unicode
 属性里面需要改成这样才能够使用MFC链表
 
 #include<afxtempl.h>
#include<iostream>
using namespace std;
int main()
{
    CList<int> list;
    list.AddHead(10);//从头部添加一个节点
    list.AddHead(9);
    POSITION p = list.GetHeadPosition(); //GetHeadPosition();返回列表头元素的位置。
    //以前自己的写法是list *p=m_pHead;POSITION p等于typedef list* POSITION
    while(p)
    {
        cout << list.GetAt(p)<<endl;//打印出当前位置的元素
        list.GetNext(p);//等同于以前的p=p->next  //指向p的下一个地址
    
    }
}
公共方法
 属性                             描述
 CList:: AddHead                 将一个元素(或另一个列表中的所有元素) 添加到列表的开头(会成为新的 head) 。
 CList:: AddTail                 将一个元素(或另一个列表中的所有元素) 添加到列表的尾部(会生成新的尾部) 。
 CList:: GetAt                        获取给定位置处的元素。
 CList:: GetCount                  返回此列表中的元素数。
 CList:: GetHeadPosition         返回列表头元素的位置。
 CList:: GetTailPosition         返回列表的尾元素的位置。
 
 CList:: GetNext                 获取用于循环访问的下一个元素。
 CList:: GetPrev                 获取用于循环访问的上一个元素
 CList:: RemoveAt                 从此列表中移除按位置指定的元素。
 CList:: RemoveAll                 从此列表中移除所有元素。
 
 CList:: Find                     获取由指针值指定的元素的位置。
 CList:: FindIndex                 获取以零为基的索引指定的元素的位置。
 CList:: GetHead                 返回(不能为空) 列表的头元素。
 CList:: GetSize                 返回此列表中的元素数。
 CList:: GetTail                 返回列表的尾元素,(不能为空) 。
 CList:: InsertAfter             将新元素插入到给定位置之后。
 CList:   :InsertBefore                 将新元素插入到给定位置之前。
 CList:: IsEmpty                 测试空列表条件(不) 任何元素。
 CList:: RemoveHead             从列表头中删除元素。
 CList:: RemoveTail             从列表的末尾移除元素。
 CList:: SetAt                     设置位于给定位置的元素。
 
 2.CList类表外排序
 
 完善,做一个子菜单    int n = list.GetCount();//获取链表里面有多少节点
    POSITION* ps = new POSITION[n+1];//申请指针数组在堆空间,有多少个节点就申请多少个
    POSITION p = list.GetHeadPosition();//获取头指针
    int i = 0;
    while (ps[i++] = p)//将p指向的地址,循环赋值给指针数组        //放在循环判断里面是可以多赋值一次,将空赋值给最后
    {
        list.GetNext(p);//p等于p指向的下一个地址
    }
    i = 0;
        while (i < n-1 )//如果有5个节点就循环4次,有4个节点就循环3次
        {
            int q = i, m = i + 1;
            while (m < n)//如果有5个节点就循环4次,有4个节点就循环3次
            {
                if (strcmp(list.GetAt(ps[q]).name,list.GetAt(ps[m]).name))//第一条节点的内容和后面的比,如果有大于后面的
                    q = m;//就将q等于m,列如;p[2]>p[3],将2变成3  |  循环后在比较p[3]>p[4],如果p[3]的内容不大于p[4] 4加1
                m++;//m加1,在次比较          3在加1              |  循环后在比较p[3]>p[5].......
            }
            if (q != i)//最后交换
            {
                POSITION t = ps[q];
                ps[q] = ps[i];
                ps[i] = t;
            }
            i++;
        }
        i = 0;
        while (ps[i])
        {
            Data d = list.GetAt(ps[i]);
            cout << d.name << "\t" << d.zhha << "\t" << d.mima << endl;将排序好的打印出来
            i++;
        }
        delete[]ps;//打印完清理一下
 三个函数int acc::sortmenu()
{
    cout << "1.按名字排序" << endl;
    cout << "2.按账号排序" << endl;
    cout << "3.按密码排序" << endl;
    cout << "4.不排序打印" << endl;
    cout << "0.退出" << endl;
    cout << "请选择" << endl;
    int i = 0;
    cin >> i;
   typedef bool(*ps)(Data& q, Data& m);//函数指针
    ps p[] = { byname,byzhha,bymima };//三个函数对应着p[0]p[1]p[2]
    switch (i)
    {
    case 1:
    case 2:
    case 3:
        sort(p[i-1]); //输入2按名字排序,p[2-1]=p[1]对应
         break;
    case 4:
        Print();
        break;
    }
    return i;
}
 需要变动的地方bool byname(Data &q,Data &m)
{
    return strcmp(q.name, m.name) < 0;
}
bool byzhha(Data& q, Data& m)
{
    return strcmp(q.zhha, m.zhha) < 0;
}
bool bymima(Data& q, Data& m)
{
    return strcmp(q.mima, m.mima) < 0;
}
 void acc::sort(ps pH)//添加一个参数
if(pH(list.GetAt(ps[q]),list.GetAt(ps[m])));//调用参数pH
 
 
 
 
 
 |