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

Напишите шаблон класса односвязного списка, который принимает элементы любого типа - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Вывести элемент, который встречается только в одном из 3 заданных массивов http://www.cyberforum.ru/cpp-beginners/thread1167387.html
Даны 3 массива. Выдать элемент, которые встречаются только в одном из них.
C++ Постройте цепной список путем включения в него n целых чисел, идущих в неубывающей последовательности Постройте цепной список путем включения в него n целых чисел, идущих в неубывающей последовательности. В следующей части вашей программы включите в список без нарушения упорядоченности произвольное новое число и исключите другое указанное число (если такое число имеется в списке). напишите код плиз) http://www.cyberforum.ru/cpp-beginners/thread1167340.html
C++ Использование массивов заменить использованием указателей в приведенном коде
Помогите решить две задачи через указатели. Я их сделал через массив а через указатели не получается заранее спасибо вот первая задача #include <iostream> #include <conio.h> #include <Windows.h> using namespace std;
Найти количество повторений буквы (заданная пользователем) не делая отличия в каком регистре она задана C++
Считать строку с консоли, из файла 1. найти количество повторений буквы (заданная пользователем) не делая отличия в каком регистре она задана 2. найти количество разных букв в строке 3. найти самую повторяющуюся букву 4. найти самую редкую букву 5. найти количество гласных и количество их повторений 6. найти количество согласных и их повторений 7. найти количество слов в строке 8. найти...
C++ Написать библиотеку для обработки одномерного динамического массива http://www.cyberforum.ru/cpp-beginners/thread1167321.html
Написать библиотеку для обработки одномерного динамического массива (инициализация, ввод/вывод, поиск, сортировка, удаление и добавление элементов). 1. оформить библиотеку в виде набора функций 2. оформить массив как структуру с методами обработки 3*. перегрузить операции над массивом
C++ Преобразование части строки типа char в число Доброго времени суток! Подскажите, как преобразовать строку типа char в число? Пример: Есть строка с датой в формате чч-мм-гг "05-05-14". Как получить последние 2 цифры? (год) подробнее

Показать сообщение отдельно
schdub
2935 / 1279 / 237
Регистрация: 19.01.2009
Сообщений: 3,344
Завершенные тесты: 1
05.05.2014, 22:52     Напишите шаблон класса односвязного списка, который принимает элементы любого типа
list.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
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
#pragma once
 
#include <cassert>
 
namespace op {
 
template <class T>
class OneLinkedList {
private:
    struct Node {
        T     value;
        Node *next;
        Node(const T & val, Node * nex) : value(val), next(nex) {}
    };
    Node * mHead;
    int    mCount;
public:
    class Iterator {
    public:
        Iterator(Node* curr) : mCurr(curr) {}
        T & operator*() {
            assert(mCurr != NULL);
            return mCurr->value;
        }
        const T & operator*() const {
            assert(mCurr != NULL);
            return mCurr->value;
        }
        void operator++() const {
            assert(mCurr != NULL);
            mCurr = mCurr->next;
        }
        bool operator==(const Iterator & other) const {
            return (mCurr == other.mCurr);
        }
        bool operator!=(const Iterator & other) const {
            return (mCurr != other.mCurr);
        }
    private:
        mutable Node * mCurr;
    };
 
    typedef Iterator iterator;
    typedef const Iterator const_iterator;
    typedef T& reference;
    typedef const T& const_reference;
    typedef T* pointer;
    typedef const T* const_pointer;
 
    const_reference front() const {
        assert(mHead != NULL);
        return mHead->value;
    }
    reference front() {
        assert(mHead != NULL);
        return mHead->value;
    }
 
    iterator begin() {
        return Iterator(mHead);
    }
    iterator end() {
        return Iterator(NULL);
    }
    const_iterator begin() const {
        return Iterator(mHead);
    }
    const_iterator end() const  {
        return Iterator(NULL);
    }
    void remove(const iterator & o) {
        for (Node * n = mHead, *p = 0; n; p=n, n=n->next) {
            if (n->value == *o) {
                (p ? p->next : mHead) = n->next;
                --mCount;
                delete n;
                return;
            }
        }
    }
 
    OneLinkedList() : mHead(0), mCount(0) {}
    ~OneLinkedList() { destroy(mHead); }
 
    void destroy(Node* r) {
        Node * n = r;
        while (n) {
            r = n;
            n = n->next;
            delete r;
        }
    }
    void insert(const T & value) {
        mHead = new Node(value, mHead);
        ++mCount;
    }
    void remove(const T & value) {
        for (Node * n = mHead, *p = 0; n; p=n, n=n->next) {
            if (n->value == value) {
                (p ? p->next : mHead) = n->next;
                --mCount;
                delete n;
                return;
            }
        }
    }
    bool contains(const T & value) const {
        for (const iterator & b = begin(), & e = end(); b != e; ++b) {
            if (*b == value) return true;
        }
        return false;
    }
    bool empty() const {
        return (mHead == 0);
    }
    int size() const {
        return mCount;
    }
};
 
} // namespace op
Использование (для Google Test):
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
// ...
 
TEST(List, oneLinked) {
    op::OneLinkedList<int> list;
    ASSERT_TRUE(list.empty());
    for (int i = 0; i < 10; ++i) {
        list.insert(i);
    }
    ASSERT_FALSE(list.empty());
    for (int i = 0; i < 10; ++i) {
        ASSERT_TRUE(list.contains(i));
        list.remove(i);
        ASSERT_FALSE(list.contains(i));
    }
    ASSERT_TRUE(list.empty());
}
 
TEST(List, oneLinkedIteratorTraverse) {
    op::OneLinkedList<int> list;
    ASSERT_TRUE(list.empty());
    for (int i = 0; i < 10; ++i) {
        list.insert(i);
    }
    ASSERT_FALSE(list.empty());
 
    ASSERT_TRUE(list.contains(9));
    list.front() = 99;
    ASSERT_TRUE(list.contains(99));
    ASSERT_FALSE(list.contains(9));
 
    int count = 0;
    op::OneLinkedList<int>::iterator it = list.begin(), ie = list.end();
    for (; it != ie; ++it, ++count) {
        *it = 99;
        std::cout << (*it) << std::endl;
    }
    ASSERT_EQ(list.size(), count);
}
 
// ...
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru