C课件案例二十五异质链表问题

上传人:gb****c 文档编号:243016587 上传时间:2024-09-13 格式:PPT 页数:39 大小:194.50KB
返回 下载 相关 举报
C课件案例二十五异质链表问题_第1页
第1页 / 共39页
C课件案例二十五异质链表问题_第2页
第2页 / 共39页
C课件案例二十五异质链表问题_第3页
第3页 / 共39页
点击查看更多>>
资源描述
,目录,退出,目录,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,案例二十五 异质链表问题,本案例知识要点,链表的使用,类的设计和使用,类的继承,基类、派生类,虚函数,一、案例需求,案例描述,设计一个异质链表,链表中不同的元素会有不同的数据类型,完成该链表的插入、删除及显示节点信息等操作。,案例效果图,异质链表问题案例效果如图所示。,异质链表问题案例效果图,功能说明,定义一个链表,此链表用来存储具有不同数据类型的学生、教师、雇员对象的基本信息。,完成该链表的插入、删除及其显示等操作。,二、案例分析,根据需求,需要建立3个类,分别是学生类、教师类、雇员类,并对这3个类抽象出一个公共的基类。,抽象出公共的基类的原因如下:,3个类中有许多相同的信息,抽象出公共基类,可以避免重复定义。,要实现异质链表。异质链表是指链表中的节点可以有不同的数据类型。也就是在这个链表中3个类的对象可以共存,节点之间需要指针链接起来,到底是用哪个类的指针无法确定,相互之间独立的类的指针之间是不能随意传递的。因此需要抽象出一个基类,在基类中定义一个基类指针,用来指向下一个对象;此指针可以指向任何一个派生类的对象,因为指向基类的指针可以指向它的派生类,。,向异质链表插入对象需要注意以下几个方面的问题:,异质链表中的各个节点可以存放3个类乃至基类中的任何一个类对象。在链表中插入哪个类的对象,可通过参数来传递。异质链表类中的插入函数传递的参数为Person *node,node为基类指针,它也可以指向派生类对象。在调用此函数时,只需传递一个对象的指针。,在异质链表中各节点元素是按照关键字顺序排列的,按照一个公有的数据成员name 排序,也就是说,用name作为排序关键字key。,向异质链表中插入对象时,由于各节点元素是属于不同类的对象,它们具有不同的数据成员,所占据的存储空间也各不相同,不同对象在链表中插入时需调用不同的方法,因此在基类Person中定义了一个虚函数insert(),在每个派生类中都具有它的重定义版本。在执行时,可根据所插入对象的不同,调用不同的虚函数版本。Insert()函数的功能是为基类定义的静态指针分配存储空间,并将本对象赋给它。在插入操作中,只需将此指针插入到链表中即告完成。,输出异质函数的各个元素时由于输出的内容不同,应有不同的输出函数。定义一个Print()虚函数,在各个派生类中均有它的重定义版本,输出是顺着链表进行的,在每个节点处均用cur-print()来调用输出函数,cur为指向当前对象的指针,依据对象类型的不同,cur-print()可调用print()的不同版本。,三、案例设计,1类的设计,(1)基类Person,基类Person的结构如图所示。,Person类图, 数据成员,char name20;,定义姓名。,Int age;,定义年龄。,Char add40;,定义地址。,Char tele15;,定义电话号码。,static Person *ptr;,定义一个指向此类对象的静态指针。,Person *next;,指向下一个对象。, 函数成员,Person(char *,int,char *,char *);,构造函数。,virtual void print();,输出基类数据成员。,virtual void insert();,此函数只定义一个接口。,(2)派生类Student,派生类Student的结构如图所示。,Student类图, 数据成员,friend class List;,链表类作为本类友元。,int level;,定义年级。,float grade_point_average;,定义平均成绩。, 函数成员,Student(char *,int,char *,char *,int,float);,构造函数。,void print();,重新定义print()函数。,void insert();,重新定义insert()函数。,(3)派生类Teacher,派生类Teacher的结构如图所示。,Teacher类图, 数据成员,friend class List;,链表类作为本类友元。,float salary;,定义工资。, 函数成员,Teacher(char *,int,char *,char *,float);,构造函数。,void print();,重新定义print()函数。,void insert();,重新定义insert()函数。,(4)派生类Staff,派生类Staff的结构如图所示。,Staff类图, 数据成员,friend class List;,链表类作为本类友元。,float hourly_wages;,定义计时工资。, 函数成员,Staff(char *,int,char *,char *,float);,构造函数。,void print();,重新定义print()函数。,void insert();,重新定义insert()函数。,(5)异质链表类List,异质链表类List的结构如图所示。,List类图, 数据成员,Person *root;,链表头指针。, 函数成员,List();,构造函数。,void insert_Person(Person *node);,向链表中插入一个对象。,void remove(char *name);,从链表中移出一个节点对象。,void print_List();,输出链表上各节点对象。,2主程序设计,在主函数中声明了一个List类的对象,Person,程序结构简单,注释清晰易,懂,流程图略。,四、案例实现,五、案例总结与提高,案例总结,本案例设计的异质链表充分体现了面向对象系统的多态性,是学习多态性很好的例子。读者要注意在向异质链表中插入对象时,由于各节点元素是属于不同类的对象,它们具有不同的数据成员,因此在插入时需调用不同的方法,所以在基类Person中定义了一个虚函数insert(),在每个派生类中都具有它的重定义版本,类似的还有输出节点信息等成员函数的设计。,多态性极大地提高了软件的复用性和可维护性,读者应熟悉并掌握多态性理论和实践,以提高软件设计水平。,案例提高,本案例只是用于演示多态性,功能性不强。读者可以在本案例的基础上,继续编写一些实用的功能来丰富本案例,并充分体会多态性的优越性。,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 大学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!