C++ 存储不同数据类型的节点

发布时间 2023-12-05 00:05:46作者: yueyingyifeng

由于节点是使用了模板,所以理论上来讲节点是可以具有不一样的数据类型的
但,我觉得这依旧很难实现,因为需要保存根节点地址,否则链表只会游离在内存当中,无法访问。

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;
	}
}

怎么能忘了这么一个好东西呢...