gpt4 book ai didi

C++ 列表实现

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:08:31 24 4
gpt4 key购买 nike

因此,我正在为编程练习构建 List 的实现。到目前为止我有这个:

#include <iostream> 
#include <algorithm>

using namespace std;

template <class T> class Link;
template <class T> class List_iterator;

template <class T>
class List
{
public:
typedef List_iterator<T> iterator;

List();
List(const List<T> & l);
~List();

bool empty() const;
unsigned int size() const;
T & back() const;
T & front() const;
void push_front(const T & x);
void push_back(const T & x);
void pop_front();
void pop_back();
iterator begin() const;
iterator end() const;
void insert(iterator pos, const T & x);
void erase(iterator & pos);
List<T> & operator=(const List<T> & l);

protected:
Link<T> * first_link;
Link<T> * last_link;
unsigned int my_size;
};

template <class T>
List<T>::List()
{
first_link = 0;
last_link = 0;
my_size = 0;
}

template <class T>
List<T>::List(const List & l)
{
first_link = 0;
last_link = 0;
my_size = 0;
for (Link<T> * current = l.first_link; current != 0; current = current -> next_link)
push_back(current -> value);
}

template <class T>
typename List<T>::iterator List<T>::begin() const
{
return iterator(first_link);
}

template <class T>
class Link
{
private:
Link(const T & x): value(x), next_link(0), prev_link(0) {}//pg. 204

T value;
Link<T> * next_link;
Link<T> * prev_link;

friend class List<T>;
friend class List_iterator<T>;
};

template <class T> class List_iterator
{
public:
typedef List_iterator<T> iterator;

List_iterator(Link<T> * source_link): current_link(source_link) { }
List_iterator(): current_link(0) { }
List_iterator(List_iterator<T> * source_iterator): current_link(source_iterator.current_link) { }

T & operator*(); // dereferencing operator
iterator & operator=(const iterator & rhs);
bool operator==(const iterator & rhs) const;
bool operator!=(const iterator & rhs) const;
iterator & operator++();
iterator operator++(int);
iterator & operator--();
iterator operator--(int);

protected:
Link<T> * current_link;

friend class List<T>;
};

template <class T>
T & List_iterator<T>::operator*()
{
return current_link -> value;
}

template <class T>
List_iterator<T> & List_iterator<T>::operator++()
{
current_link = current_link -> next_link;
return *this;
}

template <class T>
void List<T>::push_back(const T & x)
{
link<T> * last_link = new link<T> (x);
if (empty())
first_link = last_link;
else
{
last_link->prev_link = last_link;
last_link->prev_link = last_link;
last_link = last_link;
}
}

template <class T>
typename List<T>::iterator List<T>::end() const
{
return iterator(last_link);
}

int main()
{
List<int> l;

l.push_back(44); // list = 44
l.push_back(33); // list = 44, 33
l.push_back(11); // list = 44, 33, 11
l.push_back(22); // list = 44, 33, 11, 22

List<int> m(l);

List<int>::iterator itr(m.begin());
while (itr != m.end()) {
cout << *itr << endl;
itr++;
}
}`

我的 push_back() 函数有很多问题,我不太确定哪里出了问题。谁能指出我的错误?

正在更新代码:

#include <iostream> 
#include <algorithm>

using namespace std;

template <class T> class Link;
template <class T> class List_iterator;

template <class T>
class List
{
public:
typedef List_iterator<T> iterator;

List();
List(const List<T> & l);
~List();

bool empty() const;
unsigned int size() const;
T & back() const;
T & front() const;
void push_front(const T & x);
void push_back(const T & x);
void pop_front();
void pop_back();
iterator begin() const;
iterator end() const;
void insert(iterator pos, const T & x);
void erase(iterator & pos);
List<T> & operator=(const List<T> & l);

protected:
Link<T> * first_link;
Link<T> * last_link;
unsigned int my_size;
};

template <class T>
List<T>::List()
{
first_link = 0;
last_link = 0;
my_size = 0;
}

template <class T>
List<T>::List(const List & l)
{
first_link = 0;
last_link = 0;
my_size = 0;
for (Link<T> * current = l.first_link; current != 0; current = current -> next_link)
push_back(current -> value);
}

template <class T>
typename List<T>::iterator List<T>::begin() const
{
return iterator(first_link);
}

template <class T>
class Link
{
private:
Link(const T & x): value(x), next_link(0), prev_link(0) {}//pg. 204

T value;
Link<T> * next_link;
Link<T> * prev_link;

friend class List<T>;
friend class List_iterator<T>;
};

template <class T> class List_iterator//pg.207
{
public:
typedef List_iterator<T> iterator;

List_iterator(Link<T> * source_link): current_link(source_link) { }
List_iterator(): current_link(0) { }
List_iterator(List_iterator<T> * source_iterator): current_link(source_iterator.current_link) { }

T & operator*(); // dereferencing operator
iterator & operator=(const iterator & rhs);
bool operator==(const iterator & rhs) const;
bool operator!=(const iterator & rhs) const;
iterator & operator++();
iterator operator++(int);
iterator & operator--();
iterator operator--(int);

protected:
Link<T> * current_link;

friend class List<T>;
};

template <class T>
T & List_iterator<T>::operator*()
{
return current_link -> value;
}

template <class T>
List_iterator<T> & List_iterator<T>::operator++()
{
current_link = current_link -> next_link;
return *this;
}

template <class T>
void List<T>::push_back(const T & x)
{
Link<T> * new_link = new Link<T> (x);
if (first_link = 0)
first_link = last_link = new_link;
else
{
new_link->prev_link = last_link;
last_link->next_link = new_link;
last_link = new_link;
}
my_size++;
}

template <class T>
typename List<T>::iterator List<T>::end() const
{
return iterator(last_link);
}

template <class T>
List <T>::~List()
{
Link <T> * first = first_link;
while (first != 0)
{
Link <T> * next = first->next_link;
delete first;
first = next;
}
}

template<class T>
bool List_iterator<T>::operator==(const iterator & rhs) const
{
return ( this->current_link == rhs.current_link );
}

template <class T>
bool List_iterator<T>::operator!=(const iterator & rhs) const
{
return !( *this == rhs );
}

int main()
{
List<int> l;

l.push_back(44); // list = 44
l.push_back(33); // list = 44, 33
l.push_back(11); // list = 44, 33, 11
l.push_back(22); // list = 44, 33, 11, 22

List<int> m(l);

List<int>::iterator itr(m.begin());
while (itr != m.end()) {
cout << *itr << endl;
++itr;
}
}

最佳答案

Mario 和 Joe 的回答都是有效的(如果可以的话,我会投赞成票)。

问题 1

假设您发布的是 push_back() 的实际代码然后 Link<T>有错误的案例。

link<T> * last_link = new link<T> (x);

...应该是:

Link<T> * last_link = new Link<T> (x);

这样做可以摆脱 error: expected primary-expression before ‘>’ token (用 g++ 编译时)

问题 2

Mario 和 Joe 建议的替代方案是不要隐藏您的 List<T>last_link .使用与您的类的数据成员不同名的临时变量。变化:

Link<T> * last_link = new Link<T> (x);

...到...

Link<T> * new_link = new Link<T> (x);

这将使您的代码更清晰,并且您将引用正确的节点。

问题 3

按照上面的步骤应该会在push_back()中出现两个逻辑错误明显。我愿意提供帮助,但我相信你会看到的。

关于C++ 列表实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5136433/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com