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

Реализовать двунаправленный список в духе списка из STL - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ порядок в выражении http://www.cyberforum.ru/cpp-beginners/thread241378.html
a.x < b.x || a.x == b.x && a.y < b.y как это понять: как (a.x < b.x || a.x == b.x) && a.y < b.y или a.x < b.x || (a.x == b.x && a.y < b.y) Можно ли это заменить a.x <= b.x && a.y < b.y ?
C++ Перегрузка операторов >>, << Помогите перегрузить операторы ввода и вывода в классе Time. (Я совсем-совсем новичек...)Заранее всем спасибо.class Time { friend ostream &operator<<(ostream &, const Time &); friend istream &operator>>(istream& , Time &); private: int hour; int minute; public: Time(int hour = 0, int minute = 0, int second = 0 ); void setTime(int, int, int); http://www.cyberforum.ru/cpp-beginners/thread241375.html
меню сортировок C++
Первый case работает хорошо.а два последних не хотят... #include<iostream> #include<ctime> using namespace std; void main() { srand(time(0)); setlocale(0,"rus"); cout<<" Вариант a - для сортировки вставкой \n"; cout<<" Вариант b - для сортировки выбором \n";
птички C++
на дереве сидит n(0<n<1000000)птичек .они по очереди поют натуральные цифра,начиная 1-го.во время каждой следующей песни улетает то количество птичек,какое число они поют.если количество оставшихся птичек меньше того числа которого должны птички спет ,песня начинается сначала. сколько времени продлится песня птичек,если нато что спет одну цифру нужно одна секунда и улетают они мгновенно ?
C++ Поскорее бы. http://www.cyberforum.ru/cpp-beginners/thread241345.html
Точно условие не помню но суть в том что вводится с клавы логическое выражение. например А и Б и (В или С) только или, и и остальные условия тоже буквы. Надо решить выражение. Это на стэки и строки по моему. Просьба объяснить текст который напишите. Ну хоть написать какая буква что означает. И надо примитивно. по крайней мере желательно) Программа на С++!!!!!!
C++ Класс "Окружность" с данными центр и радиус окружности. Вычислить длину и площадь окружности. Объявить класс и определить для него конструктор по умолчанию, конструктор инициализации. Определить функции-члены класса для ввода и вывода членов-данных внутри объявления класса, функции расчета. Составить программу, которая определяет три объекта класса и выводит их на экран. Первый объект должен инициализироваться по умолчанию, второй использовать конструктор инициализации, третий функцию... подробнее

Показать сообщение отдельно
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
11.02.2011, 22:21  [ТС]     Реализовать двунаправленный список в духе списка из STL
Ниже код. Есть несколько вопросов.
Не могу понять как сделать push_back/front через итераторы. Не получается. Хотелось бы увидеть простой пример на одну из данных функций.
функция back() - выдает ошибку, ибо end() у меня указывает на элемент за последним, то есть tail->next. Так как tail->next == 0 то --end() не выходит, ибо curr=curr->prev где curr == tail->next, вследствие чего - ошибка. Как исправить?
Ну и плоховато дело с erase. Буду благодарен за помощь.


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
struct bidirectional_iterator_tag:public std::forward_iterator_tag
{
};
 
template<class T>
class List
{
public:
    class Iterator;
    struct Node;
    typedef Iterator iterator;
    typedef T& reference;
    typedef const T& const_reference;
 
    List():head(0), tail(0), sz(0)
    {
    }
    size_t size() const {return sz;}
    bool empty() const {return sz == 0;}
    iterator begin() {return iterator(head);}
    iterator end() {return iterator(tail->next);}
    void push_back(const_reference el)
    {
        Node* tmp=new Node(el);
        if(empty())
        {
            head=tmp;
            tail=tmp;
            ++sz;
            return;
        }
        tail->next=tmp;
        tmp->prev=tail;
        tail=tmp;
        ++sz;
    }
    void push_front(const_reference el)
    {
        Node* tmp=new Node(el);
        if(empty())
        {
            head=tmp;
            tail=tmp;
            ++sz;
            return;
        }
        head->prev=tmp;
        tmp->next=head;
        head=tmp;
        ++sz;
    }
    reference front()
    {
        return *begin();
    }
    reference back()
    {
        return *(--end());
    }
    const_reference front() const
    {
        return *begin();
    }
    const_reference back() const
    {
        return *(--end());
    }
    void erase(iterator Where)
    {
        if(Where == begin())
        {
            Node* tmp=head;
            head=head->next;
            delete tmp;
            return;
        }
        for(Node* tmp=head; tmp; tmp=tmp->next)
        {
            if(tmp == Where.MyNode())
            {
                Node* ts=tmp;
                tmp=tmp->next;
                delete ts;
            }
        }
    }
private:
    struct Node
    {
        Node(T elem_=T(), Node* next_=0, Node* prev_=0)
            :next(next_),  elem(elem_), prev(prev_)
        {
        }
        Node* next;
        Node* prev;
        T elem;
    };
    Node* head;
    Node* tail;
    size_t sz;
};
 
template<class T> class List<T>::Iterator
{
public:
    typedef bidirectional_iterator_tag iterator_category;
    typedef T value_type;
    typedef size_t difference_type;
    typedef T* pointer;
    typedef T& reference;
 
    Iterator(Node* t):
      curr(t)
      {
      }
    Iterator& operator ++()
    {
        curr=curr->next;
        return *this;
    }
    Iterator& operator --()
    {
        curr=curr->prev;
        return *this;
    }
    T& operator *()
    {
        return curr->elem;
    }
    Iterator& operator +(size_t idx)
    {
        for(size_t i=0; i<idx; ++i)
        {
            curr=curr->next;
        }
        return *this;
    }
    bool operator == (const Iterator& other) const 
    {
        return curr == other.curr;
    }
    bool operator != (const Iterator& other) const
    {
        return curr != other.curr;
    }
    Node* MyNode()
    {
        return curr;
    }
private:
    Node* curr;
};
 
Текущее время: 17:04. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru