欢迎光临散文网 会员登陆 & 注册

链表模板类QList

2022-12-27 12:50 作者:bili_98931215023  | 我要投稿

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的所有数据


链表模板类QList的评论 (共 条)

分享到微博请遵守国家法律