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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
QWERY_2012
5 / 5 / 2
Регистрация: 09.09.2012
Сообщений: 227
#1

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

23.02.2013, 10:31. Просмотров 663. Ответов 1
Метки нет (Все метки)

Есть программа, но уверен много недочётов - сам не вижу.
Например, правильно ли описаны 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;
    }
       
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.02.2013, 10:31
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Проверить программу с linked list (C++):

C-style Linked List - C++
Итак, изучал я, значит, C-style Linked List (не знаю, как будет по-русски) и столкнулся с такой проблемой: надо его заполнить. Вроде все...

Linked List описание - C++
/*!Begin Snippet:filebegin*/ #ifndef _LINKEDLIST_H_ #define _LINKEDLIST_H_ using namespace std; /*!Begin Snippet:fullnode*/ ...

Linked List класс - C++
Ребят! Помогите пожалуйста найти ошибку! Я все написал, но чтобы я не делал выбрасывает с ошибкой:( //List.h #pragma once ...

Template double linked list C++ - C++
Пытался реализовать шаблон класса двусвязный список, элементарами которого является класс структура. 1. Как теперь инициализировать класс...

Связанный список (Linked list). - C++
Добрый день. Вот пишу функцию (в коде название - smash), которая бы из текущего списка создавала 2 других: парные числа и непарные, но...

Нужен совет - как сделать circular linked list? - C++
Доброго всем времени суток!!! У меня программа которая считает queue, мне необходимо сделать circular linked list. Прошу помоши!!!!!...

1
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
23.02.2013, 11:49 #2
Цитата Сообщение от QWERY_2012 Посмотреть сообщение
правильно ли описаны private member?
Данные скрыты, это хорошо.

Цитата Сообщение от QWERY_2012 Посмотреть сообщение
Так же не понятно с VALUE SEMANTICS - Assignments и the copy constructor.
Что конкретно Вам не понятно? И почему Вы не используете русские определения (присваивание и копирующий конструктор)?
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.02.2013, 11:49
Привет! Вот еще темы с ответами:

Указатели, связной список (Linked List) и динамическое выделение памяти - C++
Я вообще не понимаю как сделать. Ребят! Помогите, как сможете! /* Написать связной список используя структуры и функции Позволить...

Linked List: error C2360: initialization of 'vp' is skipped by 'case' label - C++
Программа выдает ошибку . но я не понял в чем проблема . можете помочь исправить ? class Us { public: Us* prev; int k; ...

Linked List na C - C++
kak perevernut na C LinkedList esli mo0jno kod pojaluista.

linked error - C++
только начал программу писать и сразу траблы. Но по порядку. main.cpp: #include &lt;iostream&gt; #include &quot;newfunc.h&quot; using...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru