CMSC 162 -- LinkedList:

LinkedList

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;
}