链表模板类QList
1.定义链表节点类Node
2.定义链表类QList<T>
注意:模板类的声明和实现都在.h文件中
各个成员函数的实现
构造函数:QList::QList();
添加新的数据到链表中:void Add(T* pData);
新数据是在外部New出来的内存地址指针
排序:void Short;
因这链表只保存内存地址,所以排序就要通过外部条件传进排序条件
所以定义一个函数指针来比较两个节点中数据域中的数据大小
//比较两个数据函数指针
typedef BOOL CmpData(T*, T*);
应用实例:
1.链表的创建:
QList<STUDENT> m_stuList;
STUDENT为自定义结构类型
也可以New一个链表
QList<STUDENT>* m_pStuList;
m_pStuList=new QList<STUDENT>(TRUE);
新New的链表对象要传TRUE,表明是New出来的对象
在清空节点时根据这个值来判断是否删除链表自身(delete this);
2.根据外部条件来排序
void Short(T* t1,T* t2);
a.外部函数指针用拉姆达表达式
拉姆达表达式另一种写法:
b.通过外部全局函数来实现
4.根据外部条件查询多个数据组成的链表:FindArray
返回的链表是在堆中New的,所以用后要删除
返回的链表节点数据域的指针是不能被删除的,所以清空时要用ClearNode只清空节点内存
不要用ClearAll清空所有的节点和数据域内存,如果用了原来的链表中的数据域内存也没了
如果在清空节点后有自动删除本身,在外部就不必删除了,直接赋空值就OK
这个函数指针类型要带参数:
//查找指定条件的函数指针
typedef BOOL FindData(LPARAM,T*);
应用,和排序一样,可用拉姆达表达式,和全局函数来实现
实例:
查找年龄>30的所有数据
问题说明:
关于拉姆达表达式我还没弄明白,不知道如何把30这个值传递到匿名函数中
我用了[=n]这个符号也不成功,
如果30是全局变量就能实现传递,在类函数中的变量就传递不过去
所有就用了下面这种办法,
先把30传递到FindArray函数中,在从FindArray通过lParam传递到匿名函数中,
这样就走了个弯路,
5.根据外部条件删除符合条件的所有数据
int DelFindData(LPARAM lParam,FindData bFindData);
实例应用:
删除年龄<=32的所有数据