学逆向论坛

找回密码
立即注册

只需一步,快速开始

发新帖

670

积分

1

好友

36

主题
发表于 2021-1-21 17:19:55 | 查看: 5651| 回复: 0
本帖最后由 鸦领主 于 2021-1-22 14:35 编辑

1.MFC类库(CList类)链表的使用(MFC是vs编译器特有类库)
    CList<int> list;

<>是模板的意思,里面是你要存储的对象的类型,

MFC类库使用 CList类表外排序

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






温馨提示:
1.如果您喜欢这篇帖子,请给作者点赞评分,点赞会增加帖子的热度,评分会给作者加学币。(评分不会扣掉您的积分,系统每天都会重置您的评分额度)。
2.回复帖子不仅是对作者的认可,还可以获得学币奖励,请尊重他人的劳动成果,拒绝做伸手党!
3.发广告、灌水回复等违规行为一经发现直接禁言,如果本帖内容涉嫌违规,请点击论坛底部的举报反馈按钮,也可以在【投诉建议】板块发帖举报。

小黑屋|手机版|站务邮箱|学逆向论坛 ( 粤ICP备2021023307号 )|网站地图

GMT+8, 2024-4-26 15:57 , Processed in 0.140231 second(s), 41 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表