模板中的链接列表

时间:2015-01-06 09:48:09

标签: c++ list templates linked-list next

我正在读大学的一个项目,同时阅读C ++课程。我们目前正在使用链接列表,并且也开始使用模板。不知怎的,我无法将我的列表链接起来,换句话说,我的下一个功能不会起作用。我没有得到" Segmentation Fault(核心倾销)"因为我倾向于如果指向不正确,编译时没有投诉,因为我运行程序并将人员添加到列表中没有投诉,问题是它没有找到下一个元素,因为我没有添加它,它只打印出我的第一个元素。

这是我的元素模板:

template <class T>
class element {
private:
    element <T> * next;
    T name;
public:
    element <T> * get_nxt () {
        return next;
    }
    void set_name (string nam) {
        name = nam;
    }
    string get_name () {
        return name;
    }
    void set_nxt (element <T> * n) {
        next = n;
    }
};

所以当我不想连接两个指针时,我会使用:

  

set_nxt(element * n);

所以在代码中它看起来像(我想将ptr2设置为ptr1旁边):

  

ptr1-&GT; set_nxt(PTR2);

我后来想查看我的列表包含的元素数量,它只说一个。

这是我用来计算所有计数函数的计数函数:

template < class T >
int lista<T>::count (lista<T> & L) {
    element <T> *curr = LIST;
    int nr = 0;
    while (curr) {
        curr = curr->get_nxt();
        ++nr;
    }
    return nr;
}

这里的问题在于,即使我已经添加了2个或更多,这个函数也会返回1。

列表已以这种方式声明:

template < class T >
class lista {
private:
    element <T> * LIST;
public:
    lista () {
        LIST = NULL;
    }
    void add(lista<T> & , string, int);
    int count(lista<T> & );
    void print (lista <T> & );
};

我有LIST而不是流行的头脑。我一直盯着代码看似几个小时,我找不到任何错误。我们之前一直在做没有模板的链接列表,我认为链接列表模板的链接过程是相同的。

添加元素:

void lista<T>::add (lista<T> & L, string name, int cond) {
    element <T> *curr = LIST, *fill;
    fill = new element <T>;
    curr = new element <T>;
    if (cond == 0) {
        int nr;
        nr = L.count(L);
        if (nr == 0) {
            curr->set_name (name);
            LIST = curr;
        }
        else if (nr > 0) {
            int i;
            for (i = 1 ; i < nr ; ++i)
                curr = curr->get_nxt();
            fill->set_name(name);
            curr->set_nxt (fill);
            fill->set_nxt(NULL);
        }

忽略if(cond == 0)对此不重要。

1 个答案:

答案 0 :(得分:0)

您的lista<T>::add功能有几个问题:

  • 首先,您指定curr指向LIST,然后直接重新分配给您分配的新节点。

  • 将第一个节点添加到列表(nr == 0)时,不要将next指针设置为NULL

  • 当您添加第二个节点(nr == 1)时curr未指向第一个节点(因为第一个点),所以您根本不添加任何内容。

  • 由于上一个问题,您根本不会向列表中添加任何节点,因为除了第一个节点之外的所有节点都是第二个节点而您实际上无法添加它。

如果您在调试器中逐行执行代码,那么所有这些问题都会非常清楚。


如果是我制作add函数,它看起来像这样:

void lista<T>::add (lista<T> & L, string name, int cond) {
    if (cond == 0)
        return;

    if (LIST == nullptr) {
        // Adding the first node in the list
        LIST = new element<T>;
        LIST->set_nxtT(nullptr);
        LIST->set_name(name);
    } else {
        // First find the last node
        element<T>* last;
        for (last = LIST; last->get_nxt() != nullptr; last = last->get_nxt())
            ;

        // Add a new node
        last->set_nxt(new element<T>);
        last->get_nxt()->set_nxt(nullptr);
        last->get_nxt()->set_name(name);
    }
}