Форум программистов, компьютерный форум CyberForum.ru

Связанный список. Почему nextPtr постоянно 0? - C++

Восстановить пароль Регистрация
 
slipp1
12 / 11 / 1
Регистрация: 09.11.2012
Сообщений: 365
Записей в блоге: 1
09.11.2012, 02:13     Связанный список. Почему nextPtr постоянно 0? #1
динамический связный список
не пойму почему nextPtr( 0 ) постоянно равно 0!?
и при этом программа работает со списком добавляет, удаляет, выводит данные...

C++
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
#define LISTNODE_H
 
// forward declaration of class List required to announce that class 
// List exists so it can be used in the friend declaration at line 13
template< typename NODETYPE > class List;                            
 
template< typename NODETYPE >
class ListNode 
{
   friend class List< NODETYPE >; // make List a friend
 
public:
   ListNode( const NODETYPE & ); // constructor
   NODETYPE getData() const; // return data in node
private:
   NODETYPE data; // data
   ListNode< NODETYPE > *nextPtr; // next node in list
}; // end class ListNode
 
// constructor
template< typename NODETYPE >
ListNode< NODETYPE >::ListNode( const NODETYPE &info )
   : data( info ), nextPtr( 0 ) 
{ 
   // empty body
} // end ListNode constructor
 
// return copy of data in node
template< typename NODETYPE >
NODETYPE ListNode< NODETYPE >::getData() const 
{ 
   return data; 
} // end function getData
 
#endif
C++
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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
#ifndef LIST_H
#define LIST_H
 
#include <iostream>
using std::cout;
 
#include "Listnode.h" // ListNode class definition
 
template< typename NODETYPE >
class List 
{
public:
   List(); // constructor
   ~List(); // destructor
   void insertAtFront( const NODETYPE & );
   void insertAtBack( const NODETYPE & );
   bool removeFromFront( NODETYPE & );
   bool removeFromBack( NODETYPE & );
   bool isEmpty() const;
   void print() const;
private:
   ListNode< NODETYPE > *firstPtr; // pointer to first node
   ListNode< NODETYPE > *lastPtr; // pointer to last node
 
   // utility function to allocate new node
   ListNode< NODETYPE > *getNewNode( const NODETYPE & );
}; // end class List
 
// default constructor
template< typename NODETYPE >
List< NODETYPE >::List() 
   : firstPtr( 0 ), lastPtr( 0 ) 
{ 
   // empty body
} // end List constructor
 
// destructor
template< typename NODETYPE >
List< NODETYPE >::~List()
{
   if ( !isEmpty() ) // List is not empty
   {    
      cout << "Destroying nodes ...\n";
 
      ListNode< NODETYPE > *currentPtr = firstPtr;
      ListNode< NODETYPE > *tempPtr;
 
      while ( currentPtr != 0 ) // delete remaining nodes
      {  
         tempPtr = currentPtr;
         cout << tempPtr->data << '\n';
         currentPtr = currentPtr->nextPtr;
         delete tempPtr;
      } // end while
   } // end if
 
   cout << "All nodes destroyed\n\n";
} // end List destructor
 
// insert node at front of list
template< typename NODETYPE >
void List< NODETYPE >::insertAtFront( const NODETYPE &value )
{
   ListNode< NODETYPE > *newPtr = getNewNode( value ); // new node
 
   if ( isEmpty() ) // List is empty
      firstPtr = lastPtr = newPtr; // new list has only one node
   else // List is not empty
   {
      newPtr->nextPtr = firstPtr; // point new node to previous 1st node
      firstPtr = newPtr; // aim firstPtr at new node
   } // end else
} // end function insertAtFront
 
// insert node at back of list
template< typename NODETYPE >
void List< NODETYPE >::insertAtBack( const NODETYPE &value )
{
   ListNode< NODETYPE > *newPtr = getNewNode( value ); // new node
 
   if ( isEmpty() ) // List is empty
      firstPtr = lastPtr = newPtr; // new list has only one node
   else // List is not empty
   {
      lastPtr->nextPtr = newPtr; // update previous last node
      lastPtr = newPtr; // new last node
   } // end else
} // end function insertAtBack
 
// delete node from front of list
template< typename NODETYPE >
bool List< NODETYPE >::removeFromFront( NODETYPE &value )
{
   if ( isEmpty() ) // List is empty
      return false; // delete unsuccessful
   else 
   {
      ListNode< NODETYPE > *tempPtr = firstPtr; // hold tempPtr to delete
 
      if ( firstPtr == lastPtr )
         firstPtr = lastPtr = 0; // no nodes remain after removal
      else
         firstPtr = firstPtr->nextPtr; // point to previous 2nd node
 
      value = tempPtr->data; // return data being removed
      delete tempPtr; // reclaim previous front node
      return true; // delete successful
   } // end else
} // end function removeFromFront
 
// delete node from back of list
template< typename NODETYPE >
bool List< NODETYPE >::removeFromBack( NODETYPE &value )
{
   if ( isEmpty() ) // List is empty
      return false; // delete unsuccessful
   else 
   {
      ListNode< NODETYPE > *tempPtr = lastPtr; // hold tempPtr to delete
 
      if ( firstPtr == lastPtr ) // List has one element
         firstPtr = lastPtr = 0; // no nodes remain after removal
      else 
      {
         ListNode< NODETYPE > *currentPtr = firstPtr;
 
         // locate second-to-last element            
         while ( currentPtr->nextPtr != lastPtr )    
            currentPtr = currentPtr->nextPtr; // move to next node
 
         lastPtr = currentPtr; // remove last node
         currentPtr->nextPtr = 0; // this is now the last node
      } // end else
 
      value = tempPtr->data; // return value from old last node
      delete tempPtr; // reclaim former last node
      return true; // delete successful
   } // end else
} // end function removeFromBack
 
// is List empty?
template< typename NODETYPE > 
bool List< NODETYPE >::isEmpty() const 
{ 
   return firstPtr == 0; 
} // end function isEmpty
 
// return pointer to newly allocated node
template< typename NODETYPE >
ListNode< NODETYPE > *List< NODETYPE >::getNewNode( 
   const NODETYPE &value )
{
   return new ListNode< NODETYPE >( value );
} // end function getNewNode
 
// display contents of List
template< typename NODETYPE >
void List< NODETYPE >::print() const
{
   if ( isEmpty() ) // List is empty
   {
      cout << "The list is empty\n\n";
      return;
   } // end if
 
   ListNode< NODETYPE > *currentPtr = firstPtr;
 
   cout << "The list is: ";
 
   while ( currentPtr != 0 ) // get element data
   {
      cout << currentPtr->data << ' ';
      currentPtr = currentPtr->nextPtr;
   } // end while
 
   cout << "\n\n";
} // end function print
Добавлено через 20 минут
тут не значение ту адрес? nextPtr для каждого обьекта класа listnode? по почему она устанавливается в 0 в конструкторе???
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.11.2012, 02:13     Связанный список. Почему nextPtr постоянно 0?
Посмотрите здесь:

C++ Связанный список.
C++ Связанный список
Связанный список C++
Связанный список C++
C++ Связанный список
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
09.11.2012, 02:23     Связанный список. Почему nextPtr постоянно 0? #2
Цитата Сообщение от slipp1 Посмотреть сообщение
не пойму почему nextPtr( 0 ) постоянно равно 0!?
Это ты при отладке увидел? Не может быть!
А это что?
C++
1
newPtr->nextPtr = firstPtr;
А это?
C++
1
lastPtr->nextPtr = newPtr;
Если бы ты отладкой пользовался, брейкпоинты расставлял, в Watch заглядывал...
Но что-то мне подсказывает, что ты наобум решил, что nextPtr( 0 ) постоянно равно 0. Прав ли я?
slipp1
12 / 11 / 1
Регистрация: 09.11.2012
Сообщений: 365
Записей в блоге: 1
09.11.2012, 04:06  [ТС]     Связанный список. Почему nextPtr постоянно 0? #3
прав

Добавлено через 5 минут
но мне именно этот момент и не ясен:

C++
1
2
3
4
5
else // List is not empty
   {
      newPtr->nextPtr = firstPtr; // point new node to previous 1st node
      firstPtr = newPtr; // aim firstPtr at new node
   } // end else
получается первый обьект становится следующим
а новый становится первым

очевидно?
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
09.11.2012, 04:15     Связанный список. Почему nextPtr постоянно 0? #4
Цитата Сообщение от slipp1 Посмотреть сообщение
получается первый обьект становится следующим
а новый становится первым
ну да. Никто же не говорит, что обязательно в конец добавлять....
хотя тут и добавление в конец присутствует.
Тебе ни о чём не говорят названия функций insertAtFront() insertAtBack()
???
slipp1
12 / 11 / 1
Регистрация: 09.11.2012
Сообщений: 365
Записей в блоге: 1
09.11.2012, 13:42  [ТС]     Связанный список. Почему nextPtr постоянно 0? #5
говорят

запутаный синтаксис
C++
1
newPtr->nextPtr = firstPtr;
разобрался...

Добавлено через 3 минуты
по отладчику с++ visual studio что почитать, что бы разобраться с его работой? спасибо.
Yandex
Объявления
09.11.2012, 13:42     Связанный список. Почему nextPtr постоянно 0?
Ответ Создать тему
Опции темы

Текущее время: 21:22. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru