//Compile with "g++ -std=C++11 -O2 -o <programname> <callingfile>.cpp list.hpp"
#ifndef LIST_H
#define LIST_H
#include <iostream>
template <typename T>
class linked_list {
private:
int empty = 1;
struct node {
T data;
struct node * next;
} * head;
struct node * get_add(int index);
public:
linked_list(){head = new node;};
linked_list(T data){head = new node; head = data; empty = 0;}
~linked_list();
int size();
inline int nsize(){return sizeof(struct node);};
inline struct node * lhead() {return head;};
inline struct node * tail() {return get_add(size()-1);};
int search(T key);
T& prepend(T data);
T& append(T data);
int insert(T data, int index);
int del(int index);
int set(T data, int index);
T get(int index);
T& operator[](int i);
};
template<typename T>
std::ostream& operator<< (std::ostream &out, linked_list<T> &list);
//////////////IMPLEMENTATION//////////////
//////////////////////////////////////////
template <typename T>
T& linked_list<T>::operator[](int index){
if(index >= size()){
return append(0);
}
return get_add(index)->data;
}
template <typename T>
std::ostream& operator<< (std::ostream &out, linked_list<T> &list){
int i;
for(i = 0; i < list.size(); i++)
out << list.get(i);
return out;
}
template <typename T>
int linked_list<T>::size(){
int i;
struct node * tmp = head;
for(i = 1; tmp->next != NULL; i++)
tmp = tmp->next;
return i;
}
template <typename T>
int linked_list<T>::set(T data, int index){
if(index >= size())
return -1;
get_add(index)->data = data;
return data;
}
template <typename T>
T& linked_list<T>::prepend(T data){
if(empty){
head->data = data;
empty = 0;
return (head->data);
} else {
struct node * tmp = new node;
tmp->data = head->data;
tmp->next = head->next;
head->data = data;
head->next = tmp;
return (tmp->data);
}
}
template <typename T>
T& linked_list<T>::append(T data){
if(empty){
head->data = data;
empty = 0;
return (head->data);
} else {
struct node * tmp = new node;
tmp->data = data;
tmp->next = NULL;
tail()->next = tmp;
}
return (head->next->data);
}
template <typename T>
int linked_list<T>::insert(T data, int index){
if(index >= size())
return -1;
if(empty){
head->data = data;
empty = 0;
} else {
struct node * tmp = new node;
struct node * location = get_add(index);
struct node * prev = get_add(index-1);
tmp->data = data;
tmp->next = location;
prev->next = tmp;
}
return 0;
}
template <typename T>
int linked_list<T>::del(int index){
if(index >= size())
return -1;
struct node * prev = get_add(index-1);
struct node * tmp = prev->next->next;
delete prev->next;
prev->next = tmp;
return 0;
}
template <typename T>
int linked_list<T>::search(T key){
int i;
struct node * tmp = head;
for(i = 0; key != tmp->data; i++)
tmp = tmp->next;
return i;
}
template <typename T>
T linked_list<T>::get(int index){
if(index >= size())
return 0;
int i;
struct node * tmp = head;
for(i = 0; tmp->next != NULL && i < index; i++)
tmp = tmp->next;
return tmp->data;
}
template <typename T>
struct linked_list<T>::node * linked_list<T>::get_add(int index){
if(index >= size())
return 0;
int i = 0;
struct node * tmp = head;
while(i++ < index)
tmp = tmp->next;
return tmp;
}
template <typename T>
linked_list<T>::~linked_list(){
struct node * tmp = head->next;
for(; head->next != NULL; tmp = head->next){
head->next = head->next->next;
delete tmp;
}
delete head;
}
#endif
#include <cstdio>
bool ispowerof(int number, int base){
bool value = false;
while(number >= base && !(number % base)){
number /= base;
if(number == base){
value = true;
}
}
return value;
}
int main(void){
linked_list<int> integers;
int i, root;
for(i = 0; i < 1000; i++)
integers.append(i);
for(i = 0; i < 1000; i++){
root = integers.get(i);
integers.set(root*root, i);
if(ispowerof(root, 2))
std::cout << root << ":" << integers.get(i) << " ";
}
std::cout << std::endl;
//
linked_list<int> tape;
std::cout << ++tape[0];
return 0;
}