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]