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

Как реализовать работу со списком строк и списком цифр в классе List? - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.87
hatter
1 / 1 / 0
Регистрация: 01.09.2010
Сообщений: 134
01.09.2010, 15:42     Как реализовать работу со списком строк и списком цифр в классе List? #1
Добрый день!
Проблема такая
Есть класс-список:

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
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
class Node
{
    friend class List; //разрешение списку обращаться к своим закрытым частям
public:
    int value;
 
private:
    Node* p_next;
    Node* p_prev;
};
 
class List
{
private:
    Node* p_first;
    Node* p_last;
 
private:
    void copy(const List& list)
    {
        Node* p = NULL;
        while (p = list.get_next(p))
        {
            add(p->value);
        }
    }
public:
    List() : p_first(NULL), p_last(NULL)
    {
        //p_first = NULL;
        //p_last = NULL;
    }
    List(const List& list):  p_first(NULL), p_last(NULL)
    {
        copy(list);
    }
 
    List& operator= (const List& list)
    {
        if(this != &list)
        {
            clear();
            copy(list);
        }
 
        return *this;
    }
 
    ~List()
    {
        clear();
    }
 
    void clear()
    {
        while (p_first)
        {
            Node* p = p_first;
            p_first = p->p_next;
            delete p;
        }
        p_last = NULL;
    }
 
 
    void add(int k)
    {
        Node* p = new Node;
        p->p_prev = p_last;
        p->p_next = NULL;
        p->value = k;
 
        if (p_first == NULL)
        {
            p_last = p;
            p_first = p;
        }
        else
        {
            p_last->p_next = p;
            p_last = p;
        }
    }
    Node* get_next(Node* p) const
    {
        return p != NULL ? p->p_next /*правильное условие*/ : p_first /*неправильное условие*/;
    }
    void print()
    {
        cout << "forward:" << endl;
        for (Node* node = p_first; node != NULL; node = node->p_next)//for (Node* node = p_first; node; node = node->p_next)
        {
            cout << node->value <<" ";
        }
    }
 
 
};
 
void user_print(List& list)
{
    Node* p = NULL;
    while (p = list.get_next(p))
    {
        cout << p->value <<" ";
    }
    cout << endl;
}
/*class Iterator
{
private:
List* list;
 
public:
int get_next()
{
 
return 0;
}
};*/
//
 
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    List L1;
    for( int i=0; i<11; i++)
    {
        L1.add(i+1);
    }
    //L1.print();
    //функция принт:
    user_print(L1);
 
    List L2 = L1; //то же самое, что List L2(L1)
    user_print(L2);
    L2.add(100);
    user_print(L1);
    user_print(L2);
    
    L1 = L2;
    cout << "L1 = L2" <<endl;
    user_print(L1);
    user_print(L2);
 
    L2.add(255);
    cout << "L1 = L2 (255)" <<endl;
    user_print(L1);
    user_print(L2);
 
    cout << "L1 = L1 " <<endl;
    L1 = L1;
    user_print(L1);
 
    getchar ();
    return 0;
}
В нем нужно реализовать программу для работы со списком строк и списком целых чисел.
Образно должно это выглядеть так:
При запуске в окошке появляется надпись -
Введите 5 строк - вводим их,
После этого появляется надпись -
Введите 5 цифр - вводим их,
После этого снова появляется надпись -
Какой из 2-х списков отобразить ? (допустим N1 или N2)
И, в зависимости от того, какое из 2-х значений мы набираем (N1 , N2) на экран должен выводиться один из 2-х введенных нами ранее списков.


Подскажите, как это организовать? Если возможно, с кодом!
Буду очень благодарен .


P.S. Пытался применить подобный код

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
#include <iostream>
#include <list>
#include <string>
 
using namespace std;
 
int main()
{
  list<int> lint;
  list<string> lstr; 
  int n;
  string s;
 
  for (int i=1; i<=5; ++i) 
    {cin>>n; lint.push_back(n);}
  for (int i=1; i<=5; ++i) 
    {cin>>s; lstr.push_back(s);}
 
  cout<<"Enter 1 or 2 as a num of list"<<endl;
  cin>>n;
  switch(n)
  {
    case 1: 
      for (list<int>::iterator iter =lint.begin(); iter!=lint.end(); ++iter )
        {cout<<*iter;} break;
    case 2:
      for (list<string>::iterator iter =lstr.begin(); iter!=lstr.end(); ++iter )
        {cout<<*iter;} break;
    default: 
      cerr<<"Error!"<<endl;
      return -1;
  }
  getchar();
  return 0;
}
Но он видимо работает с классом list из стандартной библиотеки std и в моем классе не реализуется.
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.09.2010, 15:42     Как реализовать работу со списком строк и списком цифр в классе List?
Посмотрите здесь:

Программа со списком C++
в чем разница между простым линейным списком, и динамическим линейным списком? C++
C++ Задача со списком
работыас массивом как со списком C++
C++ Реализовать простейшие операции над списком
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
01.09.2010, 16:02     Как реализовать работу со списком строк и списком цифр в классе List? #2
hatter, это реализуется с помощью шаблонов. Пример шаблонного класса и шаблонной функции:
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
#include <iostream>
#include <cstdlib>
#include <string>
 
// Пример шаблонного класса
template<class T>
class foo
{
 
public:
 
    foo(const T& value)
        : m_tValue(value)
    {}
    friend std::ostream& operator << (std::ostream& os, const foo& rhs)
    {
        os << rhs.m_tValue;
        return os;
    }
 
private:
 
    T   m_tValue;
};
 
//Пример шаблонной функции
template<class T>
T sum(const T& add1, const T& add2)
{
    return add1 + add2;
}
 
int main()
{
    foo<int> ivar(5);
    std::cout << ivar << std::endl;
    foo<std::string> svar("Hello, world!");
    std::cout << svar << std::endl;
    std::cout << sum(3.3, .7) << std::endl;
    std::cout << sum(1, 8) << std::endl;
    return EXIT_SUCCESS;
}
hatter
1 / 1 / 0
Регистрация: 01.09.2010
Сообщений: 134
01.09.2010, 16:09  [ТС]     Как реализовать работу со списком строк и списком цифр в классе List? #3
Цитата Сообщение от Nameless One Посмотреть сообщение
hatter, это реализуется с помощью шаблонов
Так в этом вся и проблема! Я потому и обратился, т.к не понимаю как этот шаблон создать! Конкретно для моего класса и с такой функцией списков строк и цифр.
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
01.09.2010, 16:11     Как реализовать работу со списком строк и списком цифр в классе List? #4
Пример шаблонов - см. выше. А вообще я бы порекомендовал почитать какую-нибудь книжку по С++, чтобы не возникало таких вопросов.
hatter
1 / 1 / 0
Регистрация: 01.09.2010
Сообщений: 134
01.09.2010, 16:15  [ТС]     Как реализовать работу со списком строк и списком цифр в классе List? #5
Цитата Сообщение от Nameless One Посмотреть сообщение
Пример шаблонов - см. выше. А вообще я бы порекомендовал почитать какую-нибудь книжку по С++, чтобы не возникало таких вопросов.
Передо мной их 2 лежит - читал! Поверь, я не стал бы обращаться, если бы смог разобраться самостоятельно.
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
01.09.2010, 16:22     Как реализовать работу со списком строк и списком цифр в классе List? #6
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Вот тебе еще пример, чтобы было легче разобраться - шаблонный стек:
my_stack.hpp
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
#ifndef MY_STACK_HPP
#define MY_STACK_HPP
 
#include <stdexcept>
 
namespace my
{
    template<class T>
    class stack
    {
        struct node
        {
            T       value;
            node*   next;
 
            node(const T& val)
                : value(val), next(NULL) {}
        };
        node*       top;
 
    public:
 
        stack();
        ~stack();
        void push(const T& val);
        T pop();
        bool empty() const;
    };
 
    template<class T>
    stack<T>::stack()
        : top(NULL) {}
 
    template<class T>
    stack<T>::~stack()
    {
        while(top)
        {
            node* temp = top;
            top = top->next;
            delete temp;
        }
    }
 
    template<class T>
    void stack<T>::push(const T &val)
    {
        if(top)
        {
            node* newNode = new node(val);
            newNode->next = top;
            top = newNode;
        }
        else
            top = new node(val);
    }
 
    template<class T>
    T stack<T>::pop()
    {
        if(!top)
            throw(std::runtime_error("Can't pop from the empty stack"));
        T retVal = top->value;
        node* delNode = top;
        top = top->next;
        delete delNode;
        return retVal;
    }
 
    template<class T>
    bool stack<T>::empty() const
    {
        return (top == NULL);
    }
}
 
#endif // MY_STACK_HPP
main.cpp
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
#include <iostream>
#include <cstdlib>
 
#include "my_stack.hpp"
 
int main()
{
    try
    {
        my::stack<int> stk;
        std::cout << "Pushing to the stack..." << std::endl;
        for(size_t i= 0; i < 10; ++i, std::cout << i << " ")
            stk.push(i + 1);
        std::cout << std::endl << "Popping from the stack..." << std::endl;
        while(!stk.empty())
            std::cout << stk.pop() << " ";
        std::cout << std::endl;
    }
    catch(std::exception& e)
    {
        std::cerr << e.what() << std::endl;
        return EXIT_FAILURE;
    }
 
    return EXIT_SUCCESS;
}
Цитата Сообщение от hatter Посмотреть сообщение
Передо мной их 2 лежит - читал! Поверь, я не стал бы обращаться, если бы смог разобраться самостоятельно.
Значит, либо книги плохие, либо плохо читал. А какие, собственно, сложности возникли при самостоятельном изучении?

Цитата Сообщение от hatter Посмотреть сообщение
Конкретно для моего класса и с такой функцией списков строк и цифр.
Твой список хранит тип int в поле value. Тебе нужно для value заменить тип int на шаблонный параметр.
hatter
1 / 1 / 0
Регистрация: 01.09.2010
Сообщений: 134
01.09.2010, 16:26  [ТС]     Как реализовать работу со списком строк и списком цифр в классе List? #7
Цитата Сообщение от Nameless One Посмотреть сообщение

а какие, собственно, сложности возникли при самостоятельном изучении?
Сложность в понимании организации шаблона из класса список
ну то-есть я не могу понять, при моей конкретной задаче я должен реализовать работу со списком строк и цифр в самом классе? а потом уже создать файл шаблона и связать его с классом-список?
Я саму суть не могу понять, как они связаны должны быть.
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
01.09.2010, 16:28     Как реализовать работу со списком строк и списком цифр в классе List? #8
Кстати, итератор - это такой шаблон проектирования, который предоставляет доступ к элементам обобщенного контейнера, не заостряя внимание пользователя на внутренней структуре контейнера. В языке С++ под итератором можно упрощенно понимать указатель. Но вот самому писать класс итераторов я бы на твоем месте не стал. Тема очень сложная, тем более что тебе не удалось понять шаблоны. Если уж так хочется использовать stl-подобные итераторы в своем классе, то самый простой способ - это сделать агрегацию stl-контейнера в своем классе
hatter
1 / 1 / 0
Регистрация: 01.09.2010
Сообщений: 134
01.09.2010, 16:34  [ТС]     Как реализовать работу со списком строк и списком цифр в классе List? #9
Да, с пониманием структур у меня действительно плохо!
я логически представляю себе как это все должно выглядеть, а вот когда дело касается написания - возникают проблемы.
Спасибо тебе за оказанную помощь! Буду разбираться в примерах - что-нибудь, да получится!
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
01.09.2010, 16:41     Как реализовать работу со списком строк и списком цифр в классе List? #10
Цитата Сообщение от hatter Посмотреть сообщение
Сложность в понимании организации шаблона из класса список
ну то-есть я не могу понять, при моей конкретной задаче я должен реализовать работу со списком строк и цифр в самом классе? а потом уже создать файл шаблона и связать его с классом-список?
Я саму суть не могу понять, как они связаны должны быть.
Какой файл шаблона? Ты должен создать шаблонный класс списка, в котором тип элемента списка должен быть шаблонным параметром.
Связываение экземпляра шаблонного класса с "файлом шаблона", если я правильно тебя понял, происходит при создании данного экземпляра с помощью явного указания шаблонного параметра.

Вот так должна выглядеть упрощенная структура твоего класса:
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
// Объявление шаблонного класса
template<class T>
class List
{
    
public:
    
    List(); // Конструктор по умолчанию, создает пустой список
    List(const List<T>& rhs); // Копирующий конструктор, создает новый список на основе данного
    ~List(); // Деструктор
    // ... остальные методы
    
private:
    
    struct node // Объявление структуры-узла
    {
        T value; // Заменили тип элемента списка на шаблонный параметр T
        node* next;
        node* previous;
    };
    node* first; // Указатель на первый узел
    node* last; // Указатель на второй узел
};
 
//Реализация шаблонного класса
template<class T>
List<T>::List()
{
    // ... реализация конструктора по умолчанию
}
 
template<class T>
List<T>::List(const List<T> &rhs)
{
    // ... реализация копирующего конструктора
}
 
// ... и так далее
hatter
1 / 1 / 0
Регистрация: 01.09.2010
Сообщений: 134
01.09.2010, 16:50  [ТС]     Как реализовать работу со списком строк и списком цифр в классе List? #11
то есть я в своем классе использую явный указатель шаблонного параметра, переписываю в него все то, что есть в моем исходном классе, по примеру который ты привел. или я снова неверно понял?
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
01.09.2010, 16:58     Как реализовать работу со списком строк и списком цифр в классе List? #12
Под явным указанием шаблонного параметра я имел в виду указание типа списка при создании экземпляра класса список. Т.е. запись вида:
C++
1
2
3
std::list<int> iList; // Вот здесь
iList.push_back(5);
// ...
Цитата Сообщение от hatter Посмотреть сообщение
переписываю в него все то, что есть в моем исходном классе, по примеру который ты привел
Вот здесь ты меня вроде бы понял правильно. Тебе нужно заменить везде тип int для переменной value на шаблонный параметр (у меня в примере шаблонный параметр - T).
Ну и естественно, нужно заменить тип int для всех методов класса, которые возвращают значение элемента списка (в возвращаемом значении метода) или добавляют новый элемент (в типе параметра метода - значения нового элемента)
hatter
1 / 1 / 0
Регистрация: 01.09.2010
Сообщений: 134
01.09.2010, 17:14  [ТС]     Как реализовать работу со списком строк и списком цифр в классе List? #13
Цитата Сообщение от Nameless One Посмотреть сообщение
Вот здесь ты меня вроде бы понял правильно. Тебе нужно заменить везде тип int для переменной value на шаблонный параметр (у меня в примере шаблонный параметр - T).
Ну и естественно, нужно заменить тип int для всех методов класса, которые возвращают значение элемента списка (в возвращаемом значении метода) или добавляют новый элемент (в типе параметра метода - значения нового элемента)
Понял! И там же, насколько я понимаю, я должен буду реализовать метод для списка строк и цифр, суть которого я описал вначале, так?
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
01.09.2010, 17:38     Как реализовать работу со списком строк и списком цифр в классе List? #14
Цитата Сообщение от hatter Посмотреть сообщение
Понял! И там же, насколько я понимаю, я должен буду реализовать метод для списка строк и цифр
Нет, так делать не нужно. Вся суть в том, что шаблонные классы являются обобщенными, т.е. не зависят от того, элементы какого типа они должны хранить. И методы таких классов тоже должны быть обобщенными. Когда будешь писать свой класс, пытайся думать о нем не как о списке строк или цифр, а как о списке каких-либо элементов. Не важно, каких. Посмотри мою реализацию стека: в ней нет ничего про работу с числами, строками и т.д. Но тем не менее, этот стек может работать и с целыми числами, и с дробными, и со строками, и даже с объектами определенных тобою или кем-нибудь другим классов. Выбор объектов, которые должен хранить твой шаблонный класс, происходит в момент создания экземпляра твоего класса. На примере стека: my::stack<int> stk; - я создаю экземпляр класса stack, находящегося в пространстве имен my, указывая тип шаблонного параметра - int. Но с тем же успехом я мог создать экземпляр стека, хранящего элементы типа float, double, char, std::string и т.д.
hatter
1 / 1 / 0
Регистрация: 01.09.2010
Сообщений: 134
01.09.2010, 17:45  [ТС]     Как реализовать работу со списком строк и списком цифр в классе List? #15
ааа! хитро'!
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
01.09.2010, 17:46     Как реализовать работу со списком строк и списком цифр в классе List? #16
hatter, в том весь смысл
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.09.2010, 22:03     Как реализовать работу со списком строк и списком цифр в классе List?
Еще ссылки по теме:

C++ Работа с двунаправленым списком. STL <list>
Операции со списком C++
C++ Программа для работы с линейным списком строк

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

Или воспользуйтесь поиском по форуму:
hatter
1 / 1 / 0
Регистрация: 01.09.2010
Сообщений: 134
03.09.2010, 22:03  [ТС]     Как реализовать работу со списком строк и списком цифр в классе List? #17
Цитата Сообщение от Nameless One Посмотреть сообщение
hatter, в том весь смысл
Все, разобрался! Все заработало! Получилось! Спасибо огромное за помощь и советы, Nameless One !
Yandex
Объявления
03.09.2010, 22:03     Как реализовать работу со списком строк и списком цифр в классе List?
Ответ Создать тему
Опции темы

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