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

Закончить определение методов для класса list - C++

Восстановить пароль Регистрация
 
PG94
2 / 2 / 0
Регистрация: 15.01.2012
Сообщений: 181
30.06.2013, 11:17     Закончить определение методов для класса list #1
Доброго времени суток. Изучаю книгу Страуструпа для начинающих, одно из упражнений - завершить определения для класс list, являющегося упрощённым подобием std::list. Код ниже. Помогите, пожалуйста, разрешить следующие проблему:
Как написать функции insert и erase, которые на вход получают iterator, а не Link<Elem>* (Быстрее всего переставить указатели в узлах, но с итератором доступ к ним не получить)?
Спасибо.
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
template<class Elem> struct Link {
    Link* prev;    // previous link
    Link* succ;    // successor (next) link
    Elem  val;     // the value
    Link(const Elem& v = Elem(), Link* p = 0, Link* s = 0) : val(v), prev(p), succ(s) {}
};
 
//------------------------------------------------------------------------------
 
template<class Elem> class list {
    // representation and implementation details
public:
    class iterator;     // member type: iterator
 
    list() : first(new Link<Elem>()), last(first) {}
 
    iterator begin();   // iterator to first element
    iterator end();     // iterator to one beyond last element
 
    //iterator insert(iterator p, const Elem& v); // insert v into list after p
    //iterator erase(iterator p);                 // remove p from the list
 
    void push_back(const Elem& v);  // insert v at end
    void push_front(const Elem& v); // insert v at front
    void pop_front();   // remove the first element
    void pop_back();    // remove the last element
 
    Elem& front() { return *first; }    // the first element
    Elem& back() 
    {   
        if (first==last) return *last;
        else return *(last->prev);
    }       // the last element
 
    Link<Elem>* first;
    Link<Elem>* last;   // one-beyond-the-last link
};
 
//------------------------------------------------------------------------------
 
template<class Elem> class list<Elem>::iterator {
private:
    Link<Elem>* curr;   // current node
public:
    iterator(Link<Elem>* p) :curr(p) { }
    iterator& operator++() {curr = curr->succ; return *this; } // forward
    iterator& operator--() {curr = curr->prev; return *this; } // backwards
    Elem& operator*() { return curr->val; } // get value (dereference)
 
    friend bool operator==(const iterator& a, const iterator& b)
    {
        return a.curr==b.curr;
    }
 
    friend bool operator!=(const iterator& a, const iterator& b)
    {
        return a.curr!=b.curr;
    }
};
 
//------------------------------------------------------------------------------
 
template<class Elem> 
typename list<Elem>::iterator list<Elem>::begin()  // iterator to first element
{ 
    return iterator(first); 
}
 
//------------------------------------------------------------------------------
 
template<class Elem> 
typename list<Elem>::iterator list<Elem>::end() // iterator to one beyond last element
{ 
    return iterator(last); 
}
 
//------------------------------------------------------------------------------
 
template<class Elem> 
void list<Elem>::push_front(const Elem& v) // insert v at front
{
    first->prev=new Link<Elem>(v,0,first); 
    first=first->prev;
}
 
template<class Elem>
void list<Elem>::push_back(const Elem& v)
{
    Link<Elem>* lnk=new Link<Elem>(v,last->prev,last);
    if (last->prev) last->prev->succ=lnk;
    last->prev=lnk;
    if (first==last) first=first->prev;     //вставка в пустой список
}
 
template<class Elem>
void list<Elem>::pop_front()
{
    if (first==last) return;
    first=first->succ;
    delete first->prev;
    first->prev=0;
}
 
template<class Elem>
void list<Elem>::pop_back()
{
    if (first==last) return;
    Link<Elem>* lnk=last->prev;
    last->prev=lnk->prev;
    lnk->prev->succ=last;
    delete lnk;
}
 
//template<class Elem>
//typename list<Elem>::iterator list<Elem>::insert(iterator p, const Elem& val)
//{
//  Link<Elem>* pp=p.curr;
//  Link<Elem>* lnk=new Link<Elem>(val,pp->prev,pp);
//  pp->prev->succ=lnk;
//  pp->prev=lnk;
//  return lnk;
//}
 
//template<class Elem>
//typename list<Elem>::iterator list<Elem>::erase(iterator p)
//{
//  if (first==last) return first;
//  Link<Elem>* pp=p.curr;
//  Link<Elem>* lnk=pp->prev;
//  lnk->succ=pp->succ;
//  pp->succ->prev=lnk;
//  delete p;
//  return lnk;
//}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.06.2013, 11:17     Закончить определение методов для класса list
Посмотрите здесь:

Определение класса для работы с одномерным динамическим массивом C++
Напишите реализацию методов, предоставляющих доступ к данным класса. Отобразите в программе работу этих методов C++
C++ Определение методов класса
C++ Определение методов шаблонного класса
3 объекта класса с вызовом для них соответствующих методов C++
C++ Реализуйте интерфейс динамической структуры list для работы с объектами класса А
C++ Определение конструктора копирования для производного класса
C++ Определение методов вне класса

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

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