The
LinkedList.h file.
#ifndef LINKEDLIST__H
#define LINKEDLIST__H
#include <sstream>
using namespace std;
template<class T>
struct ListNode{
ListNode<T>* next = NULL;
ListNode<T>* prev = NULL;
T data;
};
template<class T>
struct LinkedList{
ListNode<T>* head = NULL;
ListNode<T>* tail = NULL;
int theSize = 0;
//add to tail
void append(T val){
ListNode<T>* newPtr = new ListNode<T>;
newPtr->data = val;
if(theSize == 0){
head = newPtr;
tail = newPtr;
}else{
tail->next = newPtr;
newPtr->prev = tail;
tail = newPtr;
}
theSize += 1;
}
//add to head
void prepend(T val){
ListNode<T>* newPtr = new ListNode<T>;
newPtr->data = val;
if(theSize == 0){
head = newPtr;
tail = newPtr;
}else{
head->prev = newPtr;
newPtr->next = head;
head = newPtr;
}
theSize += 1;
}
//remove from tail
T pop(){
T rv;
if(theSize == 0)
return rv;
rv = tail->data;
ListNode<T>* ptr = tail;
tail = tail->prev;
tail->next = NULL;
theSize -= 1;
if(theSize == 0)
head = NULL;
delete ptr;
return rv;
}
//remove from head
T shift(){
T rv;
if(theSize == 0){
return rv;
}
rv = head->data;
ListNode<T>* ptr = head;
head = head->next;
head->prev = NULL;
theSize -= 1;
if(theSize == 0)
tail = NULL;
delete ptr;
return rv;
}
void remove(int index){
if(index < 0 || index >= theSize)
return;
ListNode<T>* loopPtr = head;
for(int i =0; i < index; ++i){
loopPtr = loopPtr->next;
}
if(loopPtr->prev != NULL){
loopPtr->prev->next = loopPtr->next;
}else{
head = loopPtr->next;
}
if(loopPtr->next != NULL){
loopPtr->next->prev = loopPtr->prev;
}else{
tail = loopPtr->prev;
}
delete loopPtr;
theSize -= 1;
}
int size(){
return theSize;
}
void insert(T val,int index){
if(index < 0 || index >= theSize)
return;
ListNode<T>* newPtr = new ListNode<T>;
newPtr->data = val;
if(index == 0){
newPtr->next = head;
head->prev = newPtr;
head = newPtr;
}else{
ListNode<T>* loopPtr = head;
for(int i =0; i < index; ++i){
loopPtr = loopPtr->next;
}
newPtr->prev = loopPtr->prev;
loopPtr->prev = newPtr;
newPtr->prev->next = newPtr;
newPtr->next = loopPtr;
}
theSize += 1;
}
int find(T val){
ListNode<T>* ptr = head;
int i =0;
while(ptr != NULL){
if(ptr->data == val){
return i;
}
ptr = ptr->next;
i += 1;
}
return -1;
}
T get(int index){
T rv;
if(index < 0 || index >= theSize)
return rv;
ListNode<T>* ptr = head;
for(int i =0; i < index; ++i){
ptr = ptr->next;
}
return ptr->data;
}
void set(int index,T val){
if(index < 0 || index >= theSize)
return;
ListNode<T>* ptr = head;
for(int i =0; i < index; ++i){
ptr = ptr->next;
}
ptr->data = val;
}
string asString(){
stringstream sout;
sout << "{ ";
ListNode<T>* loopPtr = head;
while(loopPtr != NULL){
sout << loopPtr->data << " ";
loopPtr = loopPtr->next;
}
sout << "}";
return sout.str();
}
};
#endif
The
lists.cpp file.
#include <iostream>
#include "LinkedList.h"
using namespace std;
int main(){
LinkedList<int> list;
cout << list.asString() << endl;
list.append(1);
list.append(2);
list.append(3);
cout << list.asString() << endl;
cout << list.pop() << endl;
cout << list.asString() << endl;
list.prepend(4);
list.prepend(5);
list.prepend(6);
cout << list.asString() << endl;
cout << list.shift() << endl;
cout << list.asString() << endl;
cout << list.shift() << endl;
cout << list.asString() << endl;
return 0;
}