


之前用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; };
相关推荐:
The above is the detailed content of Design a C++ universal linked list: realize polymorphic two-way function. For more information, please follow other related articles on the PHP Chinese website!

This article explores the challenges of NULL pointer dereferences in C. It argues that the problem isn't NULL itself, but its misuse. The article details best practices for preventing dereferences, including pre-dereference checks, pointer initiali

This article explains how to create newline characters in C using the \n escape sequence within printf and puts functions. It details the functionality and provides code examples demonstrating its use for line breaks in output.

This article guides beginners on choosing a C compiler. It argues that GCC, due to its ease of use, wide availability, and extensive resources, is best for beginners. However, it also compares GCC, Clang, MSVC, and TCC, highlighting their differenc

This article emphasizes the continued importance of NULL in modern C programming. Despite advancements, NULL remains crucial for explicit pointer management, preventing segmentation faults by marking the absence of a valid memory address. Best prac

This article reviews online C compilers for beginners, focusing on ease of use and debugging capabilities. OnlineGDB and Repl.it are highlighted for their user-friendly interfaces and helpful debugging tools. Other options like Programiz and Compil

This article compares online C programming platforms, highlighting differences in features like debugging tools, IDE functionality, standard compliance, and memory/execution limits. It argues that the "best" platform depends on user needs,

This article discusses efficient code copying in C IDEs. It emphasizes that copying is an IDE function, not a compiler feature, and details strategies for improved efficiency, including using IDE selection tools, code folding, search/replace, templa

This article troubleshoots missing output windows in C program compilation. It examines causes like failing to run the executable, program errors, incorrect compiler settings, background processes, and rapid program termination. Solutions involve ch


Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

AI Hentai Generator
Generate AI Hentai for free.

Hot Article

Hot Tools

Safe Exam Browser
Safe Exam Browser is a secure browser environment for taking online exams securely. This software turns any computer into a secure workstation. It controls access to any utility and prevents students from using unauthorized resources.

ZendStudio 13.5.1 Mac
Powerful PHP integrated development environment

SublimeText3 English version
Recommended: Win version, supports code prompts!

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools
