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

Проверить программу с linked list - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Очистка памяти http://www.cyberforum.ru/cpp-beginners/thread792922.html
Подскажите пожалуйста что не так делаю, создаю массив лейблов: TLabel **Labels; Labels = new TLabel*; for(int i = 0; i < rabot + 2; i++) { Labels = new TLabel(Form1); Labels->Parent = Form1; Labels->Top = 40 + i * 30; Labels->Left = 20; Labels->Height = 20;
C++ Конструкторы Объясните на пальцах, для чего нужны конструкторы? http://www.cyberforum.ru/cpp-beginners/thread792907.html
Где найти полную документацию с++? C++
Где найти полную документацию с++, то есть с пояснением всех функций итд. на английском тоже подойдет
C++ Подскажите, пожалуйста, с ответом
Добрый всем день! Возникли вопросы по linked list: 1) Если необходимо много раз выполнять insert и removals, а так же ответить на вопрос - какие 3 предыдущие и 3 current value, то какое выполнение для класса лучше: array, Linked list, Doubly linked list или Linked list и Doubly linked list. (Мне кажется Doubly linked list - но неуверен). 2) какое выполнение для класса лучше: array,...
C++ указатели с++ http://www.cyberforum.ru/cpp-beginners/thread792883.html
доброго времени суток. Подскажите с определением указателей. Пример: int**ppi, или *pi. Что значит две звездочки (знак умножения)?
C++ вычисление суммы задана матрица целых чисел. вычислить сумму элементов матрицы, расположенных над главной диагональю подробнее

Показать сообщение отдельно
QWERY_2012
5 / 5 / 2
Регистрация: 09.09.2012
Сообщений: 227
23.02.2013, 10:31     Проверить программу с linked list
Есть программа, но уверен много недочётов - сам не вижу.
Например, правильно ли описаны private member? Так же не понятно с VALUE SEMANTICS - Assignments и the copy constructor.

Подскажите, пожалуйста.

//Программа использует Linked list для класса контейнер sequence

Header file:
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
// Description: sequence3.h
 
// CLASS PROVIDED: sequence (part of the namespace main_savitch_5)
// This is the header file for the project C++"
 
// TYPEDEFS and MEMBER CONSTANTS for the sequence class:
//   typedef ____ value_type
//     sequence::value_type is the data type of the items in the sequence. It
//     may be any of the C++ built-in types (int, char, etc.), or a class with a
//     default constructor, an assignment operator, and a copy constructor.
//
 
//   typedef ____ size_type
//     sequence::size_type is the data type of any variable that keeps track of
//     how many items are in a sequence.
 
// CONSTRUCTOR for the sequence class:
               //   sequence( )
//     Postcondition: The sequence has been initialized as an empty sequence.
 
//copy constructor
    //copying source into our sequence
    
    //destructor
    
 
// MODIFICATION MEMBER FUNCTIONS for the sequence class:
//   void start( )
//     Postcondition: The first item on the sequence becomes the current item
//     (but if the sequence is empty, then there is no current item).
 
//   void advance( )
//     Precondition: is_item returns true.
//     Postcondition: If the current item was already the last item in the
//     sequence, then there is no longer any current item. Otherwise, the new
//     current item is the item immediately after the original current item.
 
//   void insert(const value_type& entry)
//     Postcondition: A new copy of entry has been inserted in the sequence
//     before the current item. If there was no current item, then the new entry 
//     has been inserted at the front of the sequence. In either case, the newly
//     inserted item is now the current item of the sequence.
 
 
//   void attach(const value_type& entry)
//     Postcondition: A new copy of entry has been inserted in the sequence after
//     the current item. If there was no current item, then the new entry has 
//     been attached to the end of the sequence. In either case, the newly
//     inserted item is now the current item of the sequence.
 
//   void remove_current( )
//     Precondition: is_item returns true.
//     Postcondition: The current item has been removed from the sequence, and
//     the item after this (if there is one) is now the new current item.
 
// CONSTANT MEMBER FUNCTIONS for the sequence class:
//   size_type size( ) const
//     Postcondition: The return value is the number of items in the sequence.
//
//   bool is_item( ) const
//     Postcondition: A true return value indicates that there is a valid
//     "current" item that may be retrieved by activating the current
//     member function (listed below). A false return value indicates that
//     there is no valid current item.
//
//   value_type current( ) const
//     Precondition: is_item( ) returns true.
//     Postcondition: The item returned is the current item in the sequence.
 
//
// VALUE SEMANTICS for the sequence class:
//    Assignments and the copy constructor may be used with sequence objects.
 
 
 
 
 
#ifndef MAIN_SAVITCH_SEQUENCE_H
#define MAIN_SAVITCH_SEQUENCE_H
#include <cstdlib>  // Provides size_t
 
namespace main_savitch_5
{
    class sequence
    {
    public:
        // TYPEDEFS and MEMBER CONSTANTS:
        typedef double value_type;
        typedef std::size_t size_type;
        
 
        // CONSTRUCTORS:
   sequence( );
   sequence(const sequence& source);
   ~sequence( );
   
   
   // MODIFICATION MEMBER FUNCTIONS:
  void start( );
  void advance( );
  void insert(const value_type& entry);
  void attach(const value_type& entry);
  void remove_current( );
 
// CONSTANT MEMBER FUNCTIONS:
   size_type size( ) const;
   bool is_item( ) const;
   value_type current( ) const;
   
   
   private:
        node *head_ptr; // List head pointer
        node *tail_ptr; // List tail pointer
        node *cursor;   // Pointer to current
        node *precursor; // Pointer to previors 
        size_type many_nodes; // Number of nodes on the list
}
 
#endif
Implementation file:
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
178
179
180
181
182
183
184
185
186
187
188
189
190
191
#include <iostream>
#include <cstdlib>  // Provides size_t
#include "node1.h"  // Provides node class
#include <cassert>
#include "sequence3.h" 
 
using namespace std;
 
namespace main_savitch_5
{
          
          // CONSTRUCTOR for the sequence class:
 
    sequence::sequence()
    {
        head_ptr= NULL;
        tail_ptr= NULL;
        cursor=NULL;
        precursor=NULL;
        many_nodes=0;
    }
 
 
    //copy constructor
    //copying source into our sequence
        sequence::sequence(const sequence& source)
    {
        head_ptr= NULL;
        tail_ptr= NULL;
        //copys source's head_ptr and tail_ptr into sequence
        list_copy(source.head_ptr, head_ptr, tail_ptr);
        start(); //method to start at the beginning of source (head_ptr)
        for (node *ptr=source.head_ptr; ptr!=source.cursor; ptr=ptr->link())
        {
            advance();
        }
        many_nodes = source.many_nodes;
    }
    
    
//destructor
    sequence::~sequence( )
    {
        list_clear(head_ptr);
        many_nodes=0;
    }
    
 
// MODIFICATION MEMBER FUNCTIONS for the sequence class:
//   void start( )
//     Postcondition: The first item on the sequence becomes the current item
//     (but if the sequence is empty, then there is no current item).
 
    void sequence::start( )
    {
        precursor=NULL; 
        cursor=head_ptr;
    }
 
 
//   void advance( )
//     Precondition: is_item returns true.
//     Postcondition: If the current item was already the last item in the
//     sequence, then there is no longer any current item. Otherwise, the new
//     current item is the item immediately after the original current item.
 
    void sequence::advance( )
    {
        assert (is_item());
        precursor=cursor;
        cursor= cursor->link();
    }
 
//   void insert(const value_type& entry)
//     Postcondition: A new copy of entry has been inserted in the sequence
//     before the current item. If there was no current item, then the new entry 
//     has been inserted at the front of the sequence. In either case, the newly
//     inserted item is now the current item of the sequence.
 
    void sequence::insert(const value_type& entry)
    {
        if(precursor==NULL||cursor==NULL)
        {
            list_head_insert(head_ptr,entry); 
            precursor= NULL;
            cursor=head_ptr;
            if (tail_ptr==NULL)
            {
                tail_ptr=head_ptr;
            }
        }
        else
        {
            list_insert(precursor,entry);
            cursor=precursor->link();
            if(cursor->link()==NULL)
            {
                tail_ptr=cursor;
            }
        }
        many_nodes++;
    }
 
 
//   void attach(const value_type& entry)
//     Postcondition: A new copy of entry has been inserted in the sequence after
//     the current item. If there was no current item, then the new entry has 
//     been attached to the end of the sequence. In either case, the newly
//     inserted item is now the current item of the sequence.
 
    void sequence::attach(const value_type& entry)
    {
        if(head_ptr==NULL)
        {
            list_head_insert(head_ptr,entry); 
            cursor=head_ptr;
            tail_ptr=head_ptr;
        }
        else if (cursor==NULL||cursor==tail_ptr)
        {
            list_insert(tail_ptr,entry);
            precursor=tail_ptr;
            tail_ptr=tail_ptr->link();
            cursor=tail_ptr;
        }
        else
        {
            list_insert(cursor, entry);
            precursor=cursor;
            cursor=cursor->link();
        }
        many_nodes++;
    }
    
           void sequence::operator =(const sequence& source)
        {
            if (this== &source)
            {
                return;
            }
            
            list_clear(head_ptr);
            many_nodes=0;
            list_copy(source.head_ptr, head_ptr, tail_ptr);
            start();
        for (node *ptr=source.head_ptr; ptr!=source.cursor; ptr=ptr->link())
        {
            advance();
        }
            many_nodes = source.many_nodes;
        }
        
        //   void remove_current( )
//     Precondition: is_item returns true.
//     Postcondition: The current item has been removed from the sequence, and
//     the item after this (if there is one) is now the new current item.
 
        void sequence::remove_current( )
        {
            assert (is_item());
            
            if (precursor==NULL)
            {
            cursor=cursor->link();
            list_head_remove(head_ptr);
            }
            else if (cursor==tail_ptr)
            {
            list_remove(precursor);
            tail_ptr=precursor;
            cursor=NULL;
            }
            else
            {
                list_remove(precursor);
                cursor=precursor->link();
            }
            
            many_nodes--;
        }
        
        
        //   value_type current( ) const
//     Precondition: is_item( ) returns true.
//     Postcondition: The item returned is the current item in the sequence.
            sequence::value_type sequence::current() const
             {
                 assert (is_item());
                 return cursor->data();
             }
}
Test programa:
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
// Simple Test Program for grading and evaluating the
//  Sequence class
 
 
#include <iostream>     // Provides cout.
#include <cstdlib>      // Provides size_t.
#include "sequence3.h"  // Provides a double type sequence class implemented by a linked list
using namespace std;
using namespace main_savitch_5;
 
void printSequence(sequence);
int main( )
{
    cout << "****************************************" << endl;
    cout << "Homework Four Basic Test Program" << endl;
   
 // Start by creating a new Sequence object
 // And testing its initial values
    cout << "****************************************" << endl;
    cout << "Creating first sequence object" << endl;
    sequence testOne;
    printSequence(testOne);
 // Add some items to the sequence using insert
    cout << "****************************************" << endl;
    cout << "Add three values using Insert" << endl;
    testOne.insert(100.0);
    testOne.insert(200.0);
    testOne.insert(300.0);
    printSequence(testOne);
 // Add some items to the sequence using attach
    cout << "****************************************" << endl;
    cout << "Add three values using Attach/Insert" << endl;
    testOne.attach(210.0);
    testOne.insert(220.0);
    testOne.insert(230.0);
    printSequence(testOne);
 // Remove two items 
    cout << "****************************************" << endl;
    cout << "Remove two values using Remove_current" << endl;
    testOne.remove_current();
    testOne.remove_current();
    printSequence(testOne);
 // Test the copy constructor
    cout << "****************************************" << endl;
    cout << "Testing the copy constructor" << endl;
    sequence testTwo(testOne);
    printSequence(testTwo);
 
    system("Pause");
    return EXIT_SUCCESS;
 
}
 
void printSequence(sequence thisSequence)
{
     // Displays the current state of a sequence object
    cout << "Current Size: " << thisSequence.size() << endl;
    if (thisSequence.is_item())
    {
       cout << "Current value of is_item is True" << endl;
       cout << "Current value: " << thisSequence.current() << endl;
    }
    else
       cout << "Current value of is_item is False" << endl;
    if (thisSequence.size() > 0)
    {
       cout << "Sequence values:" << endl;
       for (thisSequence.start(); thisSequence.is_item(); thisSequence.advance())
           cout << thisSequence.current() << endl;
    }
       
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 12:09. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru