I've written a singly linked list in C++. Would appreciate reviews on code efficiency and best practices.
#ifndef SLIST_HPP
#define SLIST_HPP
#include <stdexcept>
template <typename T> struct node{
node(T data):data(data),next(nullptr){}
T data;
node<T> * next;
};
template< typename T> class slist{
node<T>* head;
int size;
public:
slist(node<T>* head):head(head), size(0){}
slist(const slist<T>& rhs){
node<T>* temp = rhs.getHead();
node<T>* current = new node<T>(temp->data);
while(temp != nullptr){
current->next = new node<T>(temp->next->data);
temp = temp->next;
current = current->next;
}
}
~slist(){
if(head == nullptr) return;
while(head != nullptr){
node<T>* current = head;
head = head->next;
delete(current);
}
}
slist& operator= (const slist& rhs){
node<T>* temp = rhs.getHead();
try{
if(temp == nullptr) throw std::runtime_error("Can't assign null");
}catch(std::runtime_error& e){
std::cout<<e.what()<<std::endl;
}
node<T>* current = head;
while(temp != nullptr){
temp = temp->next;
current = current->next;
current->next = new node(temp->next->data);
}
}
node<T>* getHead()const {
return head;
}
void add(node<T>* p, T item){
if(p == nullptr) return;
node<T>* current = new node<T>(item);
node<T>* temp = p->next;
p->next = current;
current->next = temp;
size++;
}
void insertFront(T item){
node<T>* p = new node<T>(item);
if(head == nullptr){
p = head;
size++;
return;
}
p->next = head;
head = p;
size++;
}
void insertBack(T item){
node<T>* p = new node<T>(item);
node<T>* current = head;
while(current->next != nullptr){
current = current->next;
}
current->next = p;
size++;
}
void remove(T item){
bool check = false;
node<T>* current = head;
try {
while(current != nullptr){
if(current->data == item) check = true;
current = current->next;
}
if(!check){
throw std::runtime_error("Item not in list");
}
}catch(std::runtime_error& e){
std::cout<<e.what()<<std::endl;
exit(-1);
}
current = head;
while(current != nullptr){
if(current->next->data == item){
node<T>* temp = current->next;
current->next = current->next->next;
delete(temp);
break;
}
current = current->next;
}
size--;
}
int getSize () const {
return size;
}
void printList(){
node<T>* current = head;
while(current != nullptr){
if(current->next != nullptr){
std::cout<<current->data<<"->";
}else{
std::cout<<current->data<<std::endl;
}
current = current->next;
}
}
};
#endif //SLIST_HPP