Listes doublement chaînées
Bonjour,
Pour mon plaisir perso, j'ai l'intention de créer une petite classe qui me permettra de manipuler aisément les listes doublement chaînées. Apparement le code ci-dessous fonctionne correctement. En revanche je ne comprends pas pourquoi je suis obligé de créer un pointeur de ma liste pour y insérer des éléments. Si je crée pas de pointeur, j'ai une "segmentation fault", sympa quoi ... De plus, j'aimerai que quelques personnes puissent me donner leur(s) avis sur le code même et les éventuelles erreurs. Merci d'avance :)
Fichier "node.h"
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
|
template<typename T> class CNode
{
protected :
T m_Value;
CNode<T> * m_Previous, * m_Next;
public :
CNode( const T & Value = T(), CNode<T> * Previous = NULL, CNode<T> * Next = NULL ) : m_Value(Value), m_Previous(Previous), m_Next(Next) {}
CNode( const CNode<T> & Node )
{
m_Value = Node.m_Value;
m_Previous = Node.m_Previous;
m_Next = Node.m_Next;
}
virtual ~CNode()
{
if( m_Previous )
delete m_Previous;
if( m_Next )
delete m_Next;
}
CNode<T> & CNode<T>::operator = ( const CNode<T> & Node )
{
if( m_Previous )
delete m_Previous;
if( m_Next )
delete m_Next;
m_Value = Node.m_Value;
m_Previous = Node.m_Previous;
m_Next = Node.m_Next;
return (*this);
}
const CNode<T> * Previous() const
{
return m_Previous;
}
CNode<T> *& Previous()
{
return m_Previous;
}
const CNode<T> * Next() const
{
return m_Next;
}
CNode<T> *& Next()
{
return m_Next;
}
const T & Value() const
{
return m_Value;
}
T & Value()
{
return m_Value;
}
bool IsAlone() const
{
return !(m_Previous && m_Next);
}
}; |
Fichier "linked_list.h"
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132
|
template<typename T> class CLinkedList
{
private :
unsigned int m_NbElements;
CNode<T> * m_Head, * m_Tail;
public :
CLinkedList() : m_NbElements(0), m_Head(), m_Tail() {}
~CLinkedList()
{
if( m_Head )
delete m_Head;
if( m_Tail )
delete m_Tail;
}
bool IsEmpty() const
{
return (m_NbElements == 0);
}
CNode<T> * Head() const
{
return m_Head;
}
CNode<T> * Tail() const
{
return m_Tail;
}
void Empty()
{
}
const unsigned int & NbElements() const
{
return m_NbElements;
}
void PushBack( const T & Value )
{
CNode<T> * Node = new CNode<T>(Value);
if( !m_Head )
m_Head = Node;
Node->Previous() = m_Tail;
if( m_Tail )
m_Tail->Next() = Node;
m_Tail = Node;
++m_NbElements;
}
void PopBack()
{
if( m_NbElements > 0 )
{
if( m_NbElements == 1 )
m_Head = NULL;
CNode<T> * Node = new CNode<T>();
Node = m_Tail;
m_Tail = Node->Previous();
if( m_Tail )
{
Node->Previous() = NULL;
m_Tail->Next() = NULL;
}
--m_NbElements;
delete Node;
}
}
void PushFront( const T & Value )
{
CNode<T> * Node = new CNode<T>(Value);
if( !m_Tail )
m_Tail = Node;
Node->Next() = m_Head;
if( m_Head )
m_Head->Previous() = Node;
m_Head = Node;
++m_NbElements;
}
void PopFront()
{
if( m_NbElements > 0 )
{
if( m_NbElements == 1 )
m_Tail = NULL;
CNode<T> * Node = new CNode<T>();
Node = m_Head;
m_Head = Node->Next();
if( m_Head )
{
Node->Next() = NULL;
m_Head->Previous() = NULL;
}
--m_NbElements;
delete Node;
}
}
unsigned int Find( const T & Value )
{
CNode<T> * Node = new CNode<T>();
Node = m_Head;
unsigned int Elements(0);
for( Node = m_Head; Node; Node = Node->Next() )
if( Node->Value() == Value )
++Elements;
return Elements;
}
}; |
Nico.