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"
Fichier "linked_list.h"
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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); } };
Nico.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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; } };
Partager