【发布时间】:2014-12-09 21:53:00
【问题描述】:
我们正在我们的数据结构类中创建 LinkedLists。以下是该类的声明。
template <class T>
class LinkedList
{
public:
T m_data; // Data to be stored
LinkedList<T>* m_next; // Pointer to the next element in the list
// ...
};
老师告诉我们要实现哪些功能。我目前正在尝试实现这一点:
// Purpose: accessor function for last element node
// Returns: pointer to the last element's node in the list;
// returns NULL if list is empty
LinkedList<T>* getLastPtr();
我不确定您需要查看什么代码,所以这里是我的代码的缩小版本,它演示了这个问题:
template <class T>
class LinkedList
{
public:
T m_data;
LinkedList<T>* m_next;
LinkedList() : m_next(NULL) {}
void insert_front(const T& x);
LinkedList<T>* getLastPtr();
}
// INSERT FRONT
template<typename T>
void LinkedList<T>::insert_front(const T& x){
LinkedList<T> *tmp;
tmp = new LinkedList<T>;
tmp->m_data = m_data;
tmp->m_next = m_next;
this->m_next = tmp;
this->m_data = x;
}
// GET LAST POINTER
template<typename T>
LinkedList<T>* LinkedList<T>::getLastPtr(){
const LinkedList<T>* runner;
const LinkedList<T>* tmp; //one behind runner
runner = this;
while (runner->m_next != NULL){
tmp = runner;
runner = runner->m_next;
cout<<"tmp: "<<tmp->m_data<<endl; //FIX DIS
cout<<"runner: "<<runner->m_data<<endl; //FIX DIS
}
return tmp->m_next;
}
我们还获得了一名测试人员,但为了简化起见,我只会发布我遇到问题的部分:
LinkedList<int> A;
//TEST : Inserting 13 numbers to a
cout << endl << "TEST : Inserting 13 numbers into A" << endl;
for (int k=0; k<13; k++){
A.insert_front(k*2);
}
// TEST : Acessing last element
cout << endl << "TEST : Acessing last element" << endl;
LinkedList<int>* p = A.getLastPtr();
cout << "Last = " << p->m_data << endl;
我的问题是,当我使用函数 getLastPtr() 时,它会返回一堆随机数。我不知道我做错了什么,因为我的 getAtPtr() 函数工作正常而且我使用几乎相同的代码。
我认为这与指向错误的东西有关,或者我的最后一个元素没有指向 NULL(这应该是为了检查目的)。
这里可以看到问题的演示:http://ideone.com/mDXKsV
【问题讨论】:
-
我发现了一个问题(但不是全部...):尝试
return runner;而不是return tmp->m_next;。为什么你的回报是错误的?例如,考虑空列表:您访问了tmp->m_next,但在这种情况下tmp未初始化! -
主要问题在于如何表示一个空列表。考虑一下在您的实现中空列表和具有单个元素的列表的区别。每种情况下存在多少个
LinkedList<T>对象?或者换一种说法:具有空下一个指针的链表是什么意思?它有一个元素吗? ;) 你需要改变一些东西...... -
@leemes 是的,实际上我只是注意到它处理空列表错误,所以我将看看我是如何插入的,更重要的是它如何处理空列表。编辑:也使用返回亚军;为无效转换引发 ERROR。
-
关于
return runner:您可以从runner声明中删除const,这样它就可以工作了。但我刚刚注意到,您可以通过返回不同的东西来解决所有问题。试着找出什么! (这与你如何表示列表的尾部有关......) -
@SecretShop -
now very lost after trying several ideas你是先在纸上尝试这些想法吗?你应该进行这些练习的方式是在纸上绘制一个带有框、线、链接等的链表。然后根据设计编写代码。如果代码不能正常工作,你可以查看纸上的设计,看看你的代码哪里出错了,或者如果你的设计有问题,重做设计。您永远不会编写类似于将东西扔在墙上并希望有东西粘住的代码。
标签: c++ pointers null linked-list