鸦领主 发表于 2021-1-21 17:19:55

C++MFC类库使用 CList类表外排序

本帖最后由 鸦领主 于 2021-1-22 14:35 编辑

1.MFC类库(CList类)链表的使用(MFC是vs编译器特有类库)
    CList<int> list;
<>是模板的意思,里面是你要存储的对象的类型,


改成共享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;//申请指针数组在堆空间,有多少个节点就申请多少个
    POSITION p = list.GetHeadPosition();//获取头指针
    int i = 0;
    while (ps = 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).name,list.GetAt(ps).name))//第一条节点的内容和后面的比,如果有大于后面的
                  q = m;//就将q等于m,列如;p>p,将2变成3|循环后在比较p>p,如果p的内容不大于p 4加1
                m++;//m加1,在次比较          3在加1            |循环后在比较p>p.......
            }
            if (q != i)//最后交换
            {
                POSITION t = ps;
                ps = ps;
                ps = t;
            }
            i++;
      }
      i = 0;
      while (ps)
      {
            Data d = list.GetAt(ps);
            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 };//三个函数对应着ppp
    switch (i)
    {
    case 1:
    case 2:
    case 3:
      sort(p); //输入2按名字排序,p=p对应
         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),list.GetAt(ps)));//调用参数pH





页: [1]
查看完整版本: C++MFC类库使用 CList类表外排序