由于节点是使用了模板,所以理论上来讲节点是可以具有不一样的数据类型的
但,我觉得这依旧很难实现,因为需要保存根节点地址,否则链表只会游离在内存当中,无法访问。
template <typename T>
class Node
{
public:
T data;
void* next = nullptr;
Node() {}
Node(T data) :data(data) {}
};
void test3_1() {
Node<int>* a = new Node<int>(1);
Node<float>* b = new Node<float>(2.2f);
Node<char>* c = new Node<char>('c');
a->next = b;
b->next = c;
c->next = nullptr;
cout << ((Node<float>*)a->next)->data << endl;
}
而且,就算是保存了,也得想办法解决强制转换的问题
不过,其实在 C/C++ 中还有一个解决方案,用 union
class Node {
public:
enum class DataType { INT, FLOAT, CHAR };
union Data {//联合体
int intVal;
float floatVal;
char charVal;
} data;
DataType type;
Node* next;
// 构造函数,根据数据类型初始化联合体的成员
Node(int val) : type(DataType::INT), next(nullptr) {
data.intVal = val;
}
Node(float val) : type(DataType::FLOAT), next(nullptr) {
data.floatVal = val;
}
Node(char val) : type(DataType::CHAR), next(nullptr) {
data.charVal = val;
}
};
void test3_1(){
Node* a = new Node(1);
Node* b = new Node(2.3f);
Node* c = new Node('c');
a->next = b;
b->next = c;
c->next = nullptr;
Node* t = a;
while (t) {
switch (t->type)
{
case Node::DataType::INT:
std::cout << t->data.intVal << std::endl;
break;
case Node::DataType::FLOAT:
std::cout << t->data.floatVal << std::endl;
break;
case Node::DataType::CHAR:
std::cout << t->data.charVal << std::endl;
break;
}
t = t->next;
}
}
怎么能忘了这么一个好东西呢...