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

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

Войти
Регистрация
Восстановить пароль
 
PG94
2 / 2 / 0
Регистрация: 15.01.2012
Сообщений: 181
#1

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

30.06.2013, 11:17. Просмотров 280. Ответов 0
Метки нет (Все метки)

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

Определение методов класса - C++
Доброго времени суток, Такой вопрос возник: В заголовочном файле (head.h) я объявил класс using namespace std; class integer ...

Определение методов шаблонного класса - C++
Столкнулся с такой проблемой, реализовываю итератор для шаблонного списка, при определении метода интератора вылетает ошибка вот лог : ...

Определение методов вне класса - C++
Определение методов вне класса используется только для того, чтобы не вносить беспорядок или есть еще какая- то причина?

Определение методов шаблонного класса в файле реализации - C++
Доброго времени суток, форумчане! :) Поздравляю всех мужчин с праздником. Желаю быть мужественными, стойкими, рассудительными и...

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

3 объекта класса с вызовом для них соответствующих методов - C++
Разработайте программу с использованием класса Average, в котором реализованы вычисления среднего арифметического и среднего...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.06.2013, 11:17
Привет! Вот еще темы с ответами:

Как вынести описание методов вложенного класса за пределы класса? - C++
Подскажите, пожалуйста, как мне вынести описание методов вложенного класса за пределы класса?

Вызов методов класса из двойного указателя на экземпляр класса - C++
Добрый день! Как можно вызвать метод класса по двойному указателя на его экземпляр? struct Point { void getPoint(){}; ...

Реализуйте интерфейс динамической структуры list для работы с объектами класса А - C++
Добрый день товарищи программисты. Столкнулся с задачей и никак не могу решить... Так вот вопросы по заданию заключаются в следующем: ...

Определение конструктора копирования для производного класса - C++
Как написать определение конструктора копирования для производного класса, а именно копировании части базового класса из одного...


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

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

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