设计一个c++ 通用链表:实现多态双向的功能
导读:收集整理的这篇文章主要介绍了设计一个c++ 通用链表:实现多态双向的功能,觉得挺不错的,现在分享给大家,也给大家做个参考。之前用c实现的通用链表, 将链表的data域从具体类型转变为 void*指针 ,用c实现时费力气的是指针的赋值和也要...
收集整理的这篇文章主要介绍了设计一个c++ 通用链表:实现多态双向的功能,觉得挺不错的,现在分享给大家,也给大家做个参考。之前用c实现的通用链表, 将链表的data域从具体类型转变为 void*指针 ,用c实现时费力气的是指针的赋值和也要做到通用的打印链接:c实现的通用的双向链表现在用c++重新实现,思想大都一致:
不采用模板类,而采用虚函数实现多态性,达到通用的目的,data域不存储任何跟类型有关的信息,而是指针,将数据放于抽象类中,由指针与之建立联系。
链表有头指针 尾指针,以及之后的一系列插入删除打印操作,这些函数都写在链表类中。
链表指针类型为 链表结点类,结点的指针域和 data域,都是指针类型,data域 指向一个抽象类 object对象 。
object类是一个抽象类,当需要链表存放整型数据,就具体实现一个存放整型的子类去继承这个类,必须实现抽象类中的虚函数,以打印函数为例, 每一个不同数据类型的子类都得有自己的打印函数,而object 不关心如何打印。
class intobject :public Object{ public: intobject(int d = 0) :data(d) { } ~intobject() { } void PRint()const { cout data "--> "; } private: int data; } ; ////////////////////////////////////////////////////////////class strobject :public Object{ public: strobject(char *str) { if (str == NULL) { data = new char[1]; data[0] = '\0'; } else { data = new char[strlen(str) + 1]; strcpy(data, str); } } ~strobject() { } void Print()const { cout "\"" data "\"" "--> "; } private: char * data; } ; ////////////////////////////////////////////////////////////class floatobject :public Object{ public: floatobject(float d = 0) :data(d) { } ~floatobject() { } void Print()const { cout data "--> "; } private: float data; } ; ////////////////////////////////////////////////////////////void main(){ list mylist; for (int i = 0; i 5; ++i) { intobject *pi = new intobject(i); mylist.push_back(pi); } mylist.printlist(); char* arr[5] = { "affd", "fdas", "fDFss", "ere", "qret" } ; for (int i = 0; i 5; i++) { strobject*ps = new strobject(arr[i]); mylist.push_back(ps); } mylist.printlist(); float brr[5] = { 0.34, 54.32, 0.53, 43.2, 5.878 } ; for (int i = 0; i 5; i++) { floatobject*ps = new floatobject(brr[i]); mylist.push_back(ps); } mylist.printlist(); }
链表的释放:
class Object{ public: Object() { } virtual ~Object()//因为是虚函数,调动父类析构的 同时 调动子类的析构 { } ////定义接口 通用的打印 virtual void Print()const = 0; //纯虚函数 子类继承了之后必须实现打印函数} ; class list; class listnode{ friend class list; public: listnode() { data = NULL; next = NULL; } listnode(Object *pobj) { data = pobj; next = NULL; } ~listnode() { delete data; next = NULL; } private: Object *data; listnode *next; } ; class list{ public: list() { head = tail = new listnode; } ~list() { listnode *delp = head-> next; while (delp!= tail) { head-> next = delp-> next; delete delp; delp = head-> next; } delete head; head = tail = NULL; } void push_back(Object *pb)//尾插 { listnode *s = new listnode(pb); assert(s != NULL); tail-> next = s; tail = s; } void printlist()const { listnode *p = head-> next; while (p != NULL) { p-> data-> Print(); p = p-> next; } cout "NULL" endl; } private: listnode *head; listnode *tail; } ; ////////////////////////////////////////////////////////////class intobject :public Object{ public: intobject(int d = 0) :data(d) { } ~intobject() { cout "delete int" endl; } void Print()const { cout data "--> "; } private: int data; } ; ////////////////////////////////////////////////////////////class strobject :public Object{ public: strobject(char *str) { if (str == NULL) { data = new char[1]; data[0] = '\0'; } else { data = new char[strlen(str) + 1]; strcpy(data, str); } } ~strobject() { cout "delete string" endl; delete []data; data = NULL; } void Print()const { cout "\"" data "\"" "--> "; } private: char * data; } ;
相关推荐:
c语言使用utlist实现的双向链表
Java语言中链表和双向链表_MySQL
以上就是设计一个c++ 通用链表:实现多态双向的功能的详细内容,更多请关注其它相关文章!
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: 设计一个c++ 通用链表:实现多态双向的功能
本文地址: https://pptw.com/jishu/593131.html