单链表,模板加智能指针
#include <iostream>
#include <memory>// 定义链表节点结构
template <typename T>
struct Node {T data;std::shared_ptr<Node<T>> next;Node(const T& value) : data(value), next(nullptr) {}
};// 定义链表类
template <typename T>
class LinkedList {
private:std::shared_ptr<Node<T>> head;public:LinkedList() : head(nullptr) {}// 在链表末尾插入节点void insert(const T& value) {std::shared_ptr<Node<T>> newNode = std::make_shared<Node<T>>(value);if (head == nullptr) {head = newNode;} else {std::shared_ptr<Node<T>> temp = head;while (temp->next != nullptr) {temp = temp->next;}temp->next = newNode;}}// 打印链表元素void print() {std::shared_ptr<Node<T>> temp = head;while (temp != nullptr) {std::cout << temp->data << " ";temp = temp->next;}std::cout << std::endl;}
};int main() {LinkedList<int> list;list.insert(1);list.insert(2);list.insert(3);list.insert(4);list.print(); // 输出: 1 2 3 4return 0;
}
单链表加完美转发进阶版
#include <iostream>
#include <memory>
#include <utility>template <typename T>
class LinkedList {
private:struct Node {T data;std::shared_ptr<Node> next;Node(const T& value) : data(value), next(nullptr) {}};std::shared_ptr<Node> head;public:LinkedList() : head(nullptr) {}//头插法template <typename U>void insert(U&& data) {std::shared_ptr<Node> newNode = std::make_shared<Node>(std::forward<U>(data));newNode->next = head;head = newNode;}void print() const {std::shared_ptr<Node> current = head;while (current != nullptr) {std::cout << current->data << " ";current = current->next;}std::cout << std::endl;}
};int main() {LinkedList<int> list;list.insert(3);list.insert(5);list.insert(7);list.print(); // 输出链表内容: 7 5 3return 0;
}
双链表
#include <iostream>
#include <memory>// 定义链表节点结构
template <typename T>
struct Node {T data;std::shared_ptr<Node<T>> prev;std::shared_ptr<Node<T>> next;Node(const T& value) : data(value), prev(nullptr), next(nullptr) {}
};// 定义链表类
template <typename T>
class DoublyLinkedList {
private:std::shared_ptr<Node<T>> head;std::shared_ptr<Node<T>> tail;public:DoublyLinkedList() : head(nullptr), tail(nullptr) {}// 在链表末尾插入节点void insert(const T& value) {std::shared_ptr<Node<T>> newNode = std::make_shared<Node<T>>(value);if (head == nullptr) {head = newNode;tail = newNode;}else {tail->next = newNode;newNode->prev = tail;tail = newNode;}}// 打印链表元素void print() {std::shared_ptr<Node<T>> temp = head;while (temp != nullptr) {std::cout << temp->data << " ";temp = temp->next;}std::cout << std::endl;}
};int main() {DoublyLinkedList<int> list;list.insert(1);list.insert(2);list.insert(3);list.insert(4);list.print(); // 输出: 1 2 3 4return 0;
}
栈
#include <iostream>
#include <memory>// 定义栈节点结构
template <typename T>
struct Node {T data;std::shared_ptr<Node<T>> next;Node(const T& value) : data(value), next(nullptr) {}
};// 定义栈类
template <typename T>
class Stack {
private:std::shared_ptr<Node<T>> top;public:Stack() : top(nullptr) {}// 入栈操作void push(const T& value) {std::shared_ptr<Node<T>> newNode = std::make_shared<Node<T>>(value);newNode->next = top;top = newNode;}// 出栈操作void pop() {if (top != nullptr) {std::shared_ptr<Node<T>> temp = top;top = top->next;temp.reset();}}// 获取栈顶元素T& peek() {if (top != nullptr) {return top->data;}throw std::runtime_error("Stack is empty.");}// 判断栈是否为空bool isEmpty() {return top == nullptr;}
};int main() {Stack<int> stack;stack.push(1);stack.push(2);stack.push(3);std::cout << "Top element: " << stack.peek() << std::endl; // 输出: Top element: 3stack.pop();std::cout << "Top element: " << stack.peek() << std::endl; // 输出: Top element: 2return 0;
}
队列
#include <iostream>
#include <memory>// 定义队列节点结构
template <typename T>
struct Node {T data;std::shared_ptr<Node<T>> next;Node(const T& value) : data(value), next(nullptr) {}
};// 定义队列类
template <typename T>
class Queue {
private:std::shared_ptr<Node<T>> front;std::shared_ptr<Node<T>> rear;public:Queue() : front(nullptr), rear(nullptr) {}// 入队操作void enqueue(const T& value) {std::shared_ptr<Node<T>> newNode = std::make_shared<Node<T>>(value);if (rear == nullptr) {front = newNode;rear = newNode;} else {rear->next = newNode;rear = newNode;}}// 出队操作void dequeue() {if (front != nullptr) {std::shared_ptr<Node<T>> temp = front;front = front->next;temp.reset();if (front == nullptr) {rear = nullptr;}}}// 获取队头元素T& peek() {if (front != nullptr) {return front->data;}throw std::runtime_error("Queue is empty.");}// 判断队列是否为空bool isEmpty() {return front == nullptr;}
};int main() {Queue<int> queue;queue.enqueue(1);queue.enqueue(2);queue.enqueue(3);std::cout << "Front element: " << queue.peek() << std::endl; // 输出: Front element: 1queue.dequeue();std::cout << "Front element: " << queue.peek() << std::endl; // 输出: Front element: 2return 0;
}