Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cstdio>
- #include <stdexcept>
- template <typename T>
- class List {
- public:
- List();
- void push_back(const T &data);
- void pop_back();
- unsigned int size();
- T back();
- T front();
- private:
- template <typename X>
- struct Node {
- X data;
- Node *next;
- Node(const X &data, const Node *next) : data(data), next(next) {}
- Node(const X &data) : data(data), next(NULL) {}
- };
- Node <T> *head;
- Node <T> *tail;
- unsigned int length;
- };
- template <typename T>
- List <T>::List(): head(NULL), tail(NULL), length(0) { }
- template <typename T>
- void List <T>::push_back(const T &data) {
- if (!head) {
- head = new Node <T>(data);
- tail = head;
- }
- else {
- tail->next = new Node<T>(data);
- tail = tail -> next;
- }
- length += 1;
- }
- template <typename T>
- unsigned int List <T>::size() {
- return length;
- }
- template <typename T>
- void List <T>::pop_back() {
- if (!tail) {
- throw std::out_of_range("Can't get data from empty list");
- }
- if (head == tail) {
- delete head;
- head = NULL;
- tail = NULL;
- } else {
- Node <T> *penult = head;
- while (penult->next != tail) {
- penult = penult -> next;
- }
- tail = NULL;
- tail = new Node <T>(penult -> data);
- }
- length--;
- return;
- }
- template <typename T>
- T List <T>::back() {
- if (!tail) {
- throw std::out_of_range("Can't get data from empty list");
- } else {
- return tail -> data;
- }
- }
- template <typename T>
- T List <T>::front() {
- if (!tail) {
- throw std::out_of_range("Can't get data from empty list");
- } else {
- return head -> data;
- }
- }
- int main() {
- List <int> a;
- a.push_back(2);
- a.push_back(3);
- std::printf("%d", a.back());
- std::printf("%d", a.front());
- a.pop_back();
- std::printf("%d", a.back());
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement