Tôi bắt đầu học C++ và bài tập quyết định triển khai lớp đơn giản LinkedList
(Bên dưới là một phần của mã). Tôi có một câu hỏi liên quan đến cách xây dựng bản sao nên được thực hiện và cách tốt nhất các dữ liệu trên bản gốc LinkedList
nên được truy cập.Chi tiết triển khai bản sao của LinkedList sao chép
template <typename T>
class LinkedList {
struct Node {
T data;
Node *next;
Node(T t, Node *n) : data(t), next(n) {};
};
public:
LinkedList();
LinkedList(const LinkedList&);
~LinkedList();
//member functions
int size() const; //done
bool empty() const; //done
void append(const T&); //done
void prepend(const T&); //done
void insert(const T&, int i);
bool contains(const T&) const; //done
bool removeOne(const T&); //done
int removeAll(const T&); //done
void clear(); //done
T& last(); //done
const T& last() const; //done
T& first(); //done
const T& first() const; //done
void removeFirst(); //done
T takeFirst(); //done
void removeLast();
T takeLast();
//delete when finished
void print();
//end delete
//operators
bool operator ==(const LinkedList<T> &other) const; //done
bool operator !=(const LinkedList<T> &other) const; //done
LinkedList<T>& operator =(const LinkedList<T> &other); //done
private:
Node* m_head;
Node* m_tail;
int m_size;
};
template<typename T>
LinkedList<T>::LinkedList() : m_head(0), m_tail(0), m_size(0) {
}
...
Nhà xây dựng bản sao của tôi có thể truy cập dữ liệu trên mỗi nút của bản gốc LinkedList
trực tiếp không?
template<typename T>
LinkedList<T>::LinkedList(const LinkedList& l) {
m_head = 0;
m_tail = 0;
m_size = 0;
Node *n = l.m_head;
// construct list from given list
while(n) {
append(n->data);
n = n->next;
}
}
Hoặc tôi có nên truy cập dữ liệu thông qua người truy cập tương ứng không? (Tôi biết rằng tôi không có (các) người truy cập được xác định).
Ngoài ra, tôi dự định tạo trình lặp vòng tùy chỉnh để có thể lặp lại qua số LinkedList
. Tôi có nên sử dụng trong constructor sao chép để truy cập dữ liệu trên mỗi nút?
Một câu hỏi (hoàn toàn off-topic, tôi biết), khi nào và/hoặc lý do tại sao chúng ta nên khai báo một con trỏ đến một LinkedList
LinkedList<int> *l = new LinkedList<int>();
thay vì
LinkedList<int> l;
Cảm ơn bạn rất nhiều !! :) – bruno