问题:
如何判断某个数据元素是否存在于线性表中?
查找一个元素是否在线性表中,每次查找就需要使用for循环,因此,我们需要封装一个find成员函数。
在List.h中添加find函数:
SeqList.h中添加find的实现:
LinkList.h中添加find的实现:
测试程序如下:
1 #include <iostream> 2 #include "LinkList.h" 3 4 5 using namespace std; 6 using namespace DTLib; 7 8 9 int main() 10 { 11 LinkList<int> list; 12 13 for(int i = 0; i<5; i++) 14 { 15 list.insert(0,i); 16 } 17 18 cout << list.find(3) << endl; 19 20 return 0; 21 }
运行结果:
这意味着查找到了3,在1位置处。
如果是自定义类类型,则必须重载相等操作符。
程序如下:
当我们使用Test类定义一个LinkList类对象时,即使没有使用到Test类对象的时候,编译也会报错,告诉我们Test类没有重载相等操作符,为了解决这个错误,我们必须要定义重载操作符,但是,这时我们还没有使用到Test类具体的对象,如上图所示的那样。这个问题怎么解决呢?
我们在顶层父类Object中重载==和!=操作符,如果用户想要自定义类类型就要继承自这个Object,这相当于使用这个库的一个附加条件。
我们的默认实现是根据地址判断两个对象是否相等,而实际情况中有可能根据对象中的某个成员来判断是否相等,因此,用户有些时候需要重载相等和不相等操作符。
示例如下:
这样就可以正确查找了。
想使用DTLib,最好将每一个自定义类类型都继承自Object。
这样可以避免一些编译错误。
时间复杂度对比分析:
对于插入和删除,数据对象比较大的时候更适合用单链表。
小结: