链接: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] = '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] = ''; } 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;};'; } 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();}
链表的释放:
相关推荐:
C语言使用utlist实现的双向链表
Java语言中链表和双向链表_MySQL 总结
以上是内存溢出为你收集整理的设计一个c++ 通用链表:实现多态双向的功能全部内容,希望文章能够帮你解决设计一个c++ 通用链表:实现多态双向的功能所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)