将元素添加到已排序的链表C ++中时出现问题

时间:2015-01-20 02:18:58

标签: c++ sorting templates pointers linked-list

我在作业中遇到一个奇怪的问题,我应该写一个模板方法插入已排序的链接列表。

这是奇怪的事情。如果我有一个链表,并且我添加的值是在链表的末尾,当我添加该值时,在倒数第二个之前的每个其他值,并且新插入的值被删除。这是发生了什么的例证:

1->3->5->nullptr // starting linked list
add_ordered_i(list, 8); // add 8 to the linked list
5->8->nullptr // what ends up being output

在我讨论这个问题之前,这是我给出的模板化链表类。

#include <string>
#include <iostream>
#include <fstream>

template<class T>
class LN {
  public:
    LN ()                        : next(nullptr){}
    LN (const LN<T>& ln)         : value(ln.value), next(ln.next){}
    LN (T v, LN<T>* n = nullptr) : value(v), next(n){}
    T      value;
    LN<T>* next;
};

template<class T>
std::ostream& operator << (std::ostream& outs, LN<T>* l) {
  for (LN<T>* p = l; p != nullptr; p = p->next)
    std::cout << p->value << "->";
  std::cout << "nullptr";
  return outs;
}

template<class T>
void add_ordered_i (LN<T>*& l, T value)
{
}

以下是我对add_ordered_i函数的尝试:

template<class T>
void add_ordered_i (LN<T>*& l, T value) {
    LN<T>*& cur = l;
    LN<T>* prev = new LN<T>();
    if(cur == nullptr)  {
        cur = new LN<T>(value);
        return;
    }
    while(cur->next != nullptr)
    {
        if(value < cur->next->value || cur->next == nullptr)
            break;
        cur = cur->next;
    }
    if(cur->next == nullptr) {
        if(value < cur->value) {
            cur = new LN<T>(value, cur);
            return;
        }
        cur->next = new LN<T>(value);
        return;
    } else {
        prev = cur->next;
        cur->next = new LN<T>(value,prev);
        return;
    }
}

我不确定为什么会这样。特别是因为在main()中我能做到:

while(list->next != nullptr)
    p = p->next
p->next = new LN<int>(5);

它将在列表的末尾插入数字5,无论当前有多少元素。在我的函数中引用列表时,我做错了吗?或者是什么导致它删除除了前一个和新添加的元素之外的几乎所有元素?

1 个答案:

答案 0 :(得分:1)

这是因为curadd_ordered_i中的引用,而您cur = cur->next也会修改l

我做了一些改动,对我有用。

template<class T>
void add_ordered_i (LN<T>*& l, T value) {
    LN<T>* cur = l;//just a normal pointer will be fine
    if(cur == nullptr)  {
        l = new LN<T>(value);//a empty list
        return;
    }
    while(cur->next != nullptr)
    {
        if(value < cur->next->value)
            break;
        cur = cur->next;
    }
    if(cur == l) {
        l = new LN<T>(value, cur);//add to head of list
    } else {
        cur->next = new LN<T>(value,cur->next);
    }
}