---
tags: codebook
---
<!-- {%hackmd theme-dark %} -->
# linked list
## 10/25/2021
```cpp=
#include<iostream>
#include<algorithm>
using namespace std;
template<typename T>
struct linked_list {
//member variables
size_t container_size;
size_t size() const {return container_size;}
//struct node
struct node {
T val;
node *prev, *next;
node(const T& x, node* ptr = nullptr):
val(x), prev(ptr), next(nullptr) {}
} *start, *period;
//struct iterator
struct iterator {
node* data;
iterator(node* ptr = nullptr): data(ptr) {}
iterator operator++() {
return data = data->next;
}
iterator operator--() {
return data = data->prev;
}
bool operator==(const iterator b) const {
return data == b.data;
}
operator bool() const {
return data != nullptr;
}
T& operator*() {
return data->val;
}
T operator*() const {
return data->val;
}
};
iterator begin() {return iterator(start);}
iterator end() {return iterator(period);}
//functions
iterator insert(const T& x, iterator ptr) {
container_size++;
if (container_size == 1) {
start = new node(x);
start->next = period;
period->prev = start;
return iterator(start);
}
node* tmp = new node(x, ptr.data->prev);
if (tmp->prev)
tmp->prev->next = tmp;
tmp->next = ptr.data;
ptr.data->prev = tmp;
return iterator(tmp);
}
iterator push_front(const T& x) {
container_size++;
node* tmp = start;
start = new node(x);
start->next = tmp;
tmp->prev = start;
return iterator(start);
}
iterator push_back(const T& x) {
container_size++;
if (container_size == 1) {
start = new node(x);
start->next = period;
period->prev = start;
return iterator(period);
}
node* tmp = period->prev;
tmp->next = new node(x, tmp);
tmp = tmp->next, tmp->next = period;
period->prev = tmp;
return iterator(period);
}
iterator pop_front() {
if (container_size <= 0)
return iterator(nullptr);
container_size--;
node* tmp = start;
start = start->next;
start->prev = nullptr;
delete tmp;
return iterator(start);
}
iterator pop_back() {
if (container_size <= 0)
return iterator(nullptr);
container_size--;
node* tmp = period->prev;
if (tmp && tmp->prev)
tmp->prev->next = period;
delete tmp;
return iterator(period);
}
//constructor
linked_list(): container_size(0), start(new node(~0u)), period(start) {}
};
int main() {
linked_list<int> list;
for (auto i : {1, 2, 3, 4, 5, 6, 7, 8, 9, 10})
list.insert(i, list.end());
for (auto i = list.begin(); i != list.end(); ++i)
cout << *i << ' ';
cout << endl;
return 0;
}
```
## old version
```cpp=
struct linked_list {
struct node {
int val;
node *next;
node(const int& x): val(x) { next = nullptr; }
} *root, *end;
void push_front(const int& x) {
node* tmp = root;
root = new node(x);
root->next = tmp;
}
void push_back(const int& x) {
if (!root)
root = end = new node(x);
else
end->next = new node(x), end = end->next;
}
void print_all() {
node* cur = root;
while (cur)
cout << cur->val << ' ', cur = cur->next;
}
linked_list(): root(nullptr), end(nullptr) {}
};
```