之前用c实现的通用链表, 将链表的data域从具体类型转变为 void*指针 ,用c实现时费力气的是指针的赋值和也要做到通用的打印

链接:c实现的通用的双向链表现在用c++重新实现,思想大都一致:

不采用模板类,而采用虚函数实现多态性,达到通用的目的,data域不存储任何跟类型有关的信息,而是指针,将数据放于抽象类中,由指针与之建立联系。

20180723155621367.png

链表有头指针 尾指针,以及之后的一系列插入删除打印操作,这些函数都写在链表类中。

链表指针类型为 链表结点类,结点的指针域和 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();}

20180723160411337.png

链表的释放:

20180723162430876.png

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

更多相关文章

  1. C++11新特性- 纯虚函数和final说明符的用法
  2. C++11新特性 - 多态和虚函数,override说明符
  3. 探索C++虚函数在g++中的实现(动多态)_虚函数表剖析
  4. 第一章C++:函数返回值、GNU编译器命令
  5. 第六章C++:函数基础与应用
  6. C++异常处理:系统函数terminate的调用
  7. C++学习基础知识--this指针、静态成员、常量成员函数
  8. 深度解析C++的函数模板与类模板
  9. C++类的静态数据成员和静态成员函数

随机推荐

  1. 使用 Fiddler 对android模器进行Http监控
  2. Android Studio3.0新特性及安装图文教程
  3. afinal
  4. Android 主题和样式应用
  5. 学习Android(安卓)--从现在开始
  6. 【Android】Android程序保护与破解浅析
  7. 移动端网络优化
  8. Android开发历程_13(Service的使用)
  9. android之声音管理器AudioManager的使用
  10. android和ios的系统特性区别