View Single Post
  #3 (permalink)  
Old 05-13-2008, 03:55 PM
nolsen01 nolsen01 is offline
Newbie
 
Join Date: Jan 2008
Posts: 5
Credits: 0
Rep Power: 0
nolsen01 is on a distinguished road
Default Re: DoublyLinkedList from hell

Here is my code:

DoublyLinkedList.h
Code:
#ifndef DOUBLYLINKEDLIST_H
#define DOUBLYLINKEDLIST_H

#include "DLNode.h"

template <class E>
class DoublyLinkedList
{
private:
	DLNode<E> *head;
	DLNode<E> *tail;
	int length;
public:
	DoublyLinkedList();
	E getElementAt(int pos);
	DLNode<E> find(int pos);
	void addAtHead(E theElement);
//	void addAtTail(E theElement);
	void add(E theElement, int p);
	E remove(int p);
};

template <class E>
DoublyLinkedList<E>::DoublyLinkedList()
{

	DLNode<E> newTailNode;
	DLNode<E> newHeadNode;
	this->tail = &newTailNode;
	this->head = &newHeadNode;
	newTailNode.setSuccessor(*tail);
	newTailNode.setPredecessor(NULL);
	newHeadNode.setPredecessor(*head);
	newHeadNode.setSuccessor(NULL);

	this->length = 0;
}

template <class E>
E DoublyLinkedList<E>::getElementAt(int pos)
{
	if (pos > this->length)
		return NULL;
	else if(pos < 0)
		return NULL;
	else if(pos == 0)
		return NULL;

	return find(pos).getElement();
}

template <class E>
DLNode<E> DoublyLinkedList<E>::find(int pos)
{
	DLNode<E> cursor = head.returnSuccessor();

	int i = 0;
	while(i != pos)
	{
		cursor = cursor.getSuccessor();
		i++;
	}

	return cursor;
}

template <class E>
void DoublyLinkedList<E>::addAtHead(E theElement)
{
	DLNode<E> newNode(theElement, (DLNode<E> *)head->getSuccessor(), head);
	DLNode<E> *node2 = (DLNode<E> *)head->getSuccessor();
	node2->setPredecessor(newNode);
	head->setSuccessor(newNode);
}

/*
template <class E>
void DoublyLinkedList<E>::addAtTail(E theElement)
{
	DLNode<E> newNode(theElement);
	//DLNode<E> previousNode; 
	//previousNode.setEqualTo(tail.getPredecessor());

	newNode.setSuccessor(this->tail);
	newNode.setPredecessor(this->tail->getPredecessor());
	tail->getPredecessor()->setSuccessor(&newNode);
	tail->setPredecessor(&newNode);
}
*/


#endif
SLNode.h
Code:
#ifndef _SLNODE_H
#define _SLNODE_H

template <class E>
class SLNode
{
private:
	E element;
	SLNode<E> *successor;
public:
	SLNode();
	SLNode(E theElement);
	SLNode(E theElement, SLNode<E> theSuccessor);
	E getElement();
	void setElement(E newElement);
	SLNode<E> *getSuccessor();
	void setSuccessor(SLNode<E> newSuccessor);
	//SLNode<E> &operator = (SLNode<E> node);
};

template <class E>
SLNode<E>::SLNode()
{
	this->successor = NULL;
	this->element = NULL;
}

template <class E>
SLNode<E>::SLNode(E theElement)
{
	this->successor = NULL;
	this->element = theElement;
}


template <class E>
SLNode<E>::SLNode(E theElement, SLNode<E> theSuccessor)
{
	this->element = theElement;
	this->successor = &theSuccessor;
}

template <class E>
E SLNode<E>::getElement()
{
	return this->element;
}

template <class E>
void SLNode<E>::setElement(E newElement)
{
	this->element = newElement;
}

template <class E>
SLNode<E> *SLNode<E>::getSuccessor()
{
	return this->successor;
}

template <class E>
void SLNode<E>::setSuccessor(SLNode<E> newSuccessor)
{
		this->successor = &newSuccessor;
}


#endif

DLNode.h:
Code:
#ifndef _DLNODE_H
#define _DLNODE_H
#include "SLNode.h"

template <class E>

class DLNode : public SLNode<E>
{
private:
	DLNode<E> *predecessor;
public:
	DLNode();
	DLNode(E &theElement);
	DLNode(E theElement, DLNode<E>	*theSuccessor, DLNode<E> *thePredecessor);
	DLNode<E> *getPredecessor();
	void setPredecessor(DLNode<E> newSuccessor);
	//void setEqualTo(DLNode<E> *newNode);
};

template <class E>
DLNode<E>::DLNode():SLNode()
{
	this->setPredecessor(NULL);
}

template <class E>
DLNode<E>::DLNode(E &theElement):SLNode(theElement)
{
	this->setPredecessor(NULL);
}

template <class E>
DLNode<E>::DLNode(E theElement, DLNode<E> *theSuccessor, DLNode<E> *thePredecessor)
{
	this->setSuccessor(*theSuccessor);
	this->setElement(theElement);
	this->setPredecessor(*thePredecessor);
	
}

template <class E>
DLNode<E> *DLNode<E>::getPredecessor()
{
	return this->predecessor;
}

template <class E>
void DLNode<E>::setPredecessor(DLNode<E> newPredecessor)
{
	this->predecessor = &newPredecessor;
}

#endif

I've changed quite a bit since I've posted the original problem. Originally, I was going to create an addAtTail() method but even my professor can't seem to figure this one out so I tried instead to just write an addAtHead() method and worry about it later. I'm still running into problems.
Reply With Quote