本帖最后由 鸦领主 于 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
|