【问题标题】:How to find the end of a linked list如何找到链表的结尾
【发布时间】: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-&gt;m_next;。为什么你的回报是错误的?例如,考虑空列表:您访问了tmp-&gt;m_next,但在这种情况下tmp 未初始化!
  • 主要问题在于如何表示一个空列表。考虑一下在您的实现中空列表和具有单个元素的列表的区别。每种情况下存在多少个LinkedList&lt;T&gt; 对象?或者换一种说法:具有空下一个指针的链表是什么意思?它有一个元素吗? ;) 你需要改变一些东西......
  • @leemes 是的,实际上我只是注意到它处理空列表错误,所以我将看看我是如何插入的,更重要的是它如何处理空列表。编辑:也使用返回亚军;为无效转换引发 ERROR。
  • 关于return runner:您可以从runner 声明中删除const,这样它就可以工作了。但我刚刚注意到,您可以通过返回不同的东西来解决所有问题。试着找出什么! (这与你如何表示列表的尾部有关......)
  • @SecretShop - now very lost after trying several ideas 你是先在纸上尝试这些想法吗?你应该进行这些练习的方式是在纸上绘制一个带有框、线、链接等的链表。然后根据设计编写代码。如果代码不能正常工作,你可以查看纸上的设计,看看你的代码哪里出错了,或者如果你的设计有问题,重做设计。您永远不会编写类似于将东西扔在墙上并希望有东西粘住的代码。

标签: c++ pointers null linked-list


【解决方案1】:

在 getLastPtr() 中,我将转到列表中指向 NULL 的最后一个元素。我最初是从那个点获取数据,因此它是胡言乱语。我了解到我必须抓住 Null 后面的元素,所以我做了一个 runner 的追随者,但我也清理了一堆我的代码,特别是 insert_first。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-05
    • 1970-01-01
    • 2013-01-25
    • 1970-01-01
    • 2015-06-23
    • 2013-08-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多