题目描述
组链表是一种常用的数据结构,它由数组加链表组成,往往用于信息检索中。
每个链表由n个链表结点组成,每个链表都有头结点,头结点不存放实际数据,纯粹作为一个索引。
所有链表的头结点组成一个数组,即数组的每个元素都是一个链表头结点,它的后面延伸着一个链表。
例如一个通讯录包含五个联系人,每个联系人都有姓名和电话,每个联系人都对应一个链表结点。
Tom 8111
Any 1222
Ken 2333
Kim 2444
Tim 8222
我们先创建一个数组包含26个链表头结点,对应26个大写字母。因为有五个联系人,因此创建五个链表结点
因为上述联系人的姓名的首字母为A\K\T,因此把五个链表结点分别加入到三个头结点之后,形成三个链表。
其他字母的头结点因为无联系人,所以是空链表。构成组链表如下所示
A--Any.1222
K--Kim.2444--Ken.2333
T--Tim.8222--Tom.8444
现在使用组链表来实现通讯录,通讯录是多个联系人的信息集合,每个联系人都包含姓名和电话属性。
每个联系人对应一个链表结点,姓名首字母相同的联系人放在同一个链表中。联系人的类定义基本写好,如下参考代码
通讯录的类界面如下代码,操作包括:
1、该类没有构造函数,使用输入函数Input实现数据的输入和通讯录的初始化
2、打印函数Print,输出整个通讯录,输出格式参考样本
3、插入新的联系人,重载运算符+=来实现,如果联系人姓名已经存在,则用新的电话覆盖旧电话
注意:插入采用头插法,即新结点直接插入头结点之后
4、查找联系人姓名,重载运算符()来实现,查找成功返回链表结点指针,失败返回NULL
5、合并两个通讯录,重载运算符+来实现,合并结果放在第一个通讯录中,即左操作数。
通讯录的合并实际上是两个相同首字母的链表合并。对于相同首字母的两个链表i和j合并过程如下:
1)第二个链表j从头开始,取出联系人信息,在第一个链表i中查找。
2)如果联系人已存在,则用第二个通讯录的电话覆盖第一个通讯录的电话
3)如果联系人不存在,则把联系人插入到第一个链表i中
程序要求
1、联系人类定义和通讯录的类定义仅供参考,可自行定义
2、主函数代码不能修改
3、必须使用组链表来实现通讯录
4、通讯录类的插入、查找、合并操作都必须基于链表结点来操作。
<