2

我正在用 C++ 编写一个程序,它实现了一个双向链表,每个节点中都包含一个字符。我通过附加功能插入字符:

doubly_linked_list adam;
adam.append('a');

该功能实现如下:

//Append node
    node* append(const item c){

        //If the list is not empty...
        if(length){
            //maintain pointers to end nodes
            node* old_last_node = last;
            node* new_last_node = new node;

            //re-assign the double link and exit link
            old_last_node->next = new_last_node;
            new_last_node->back = old_last_node;
            new_last_node->next = NULL;

            //re-assign the last pointer
            last = new_last_node;
        }
        //If this is the first node
        else{
            //assign first and last to the new node
            last = first = new node;

            //assign nulls to the pointers on new node
            first->next = first->back = NULL;
        }

        //increase length and exit
        ++length;
        return last;
    }

但是,我认为存在一个问题,可能与 C++ 处理字符的方式有关。当我去打印我的列表时,不知何故我从来没有得到我已经附加到我的列表中的要打印的字符。这是我用来打印的:

//Friendly output function
    friend std::ostream& operator << (std::ostream& out_s, const doubly_linked_list& source_list){
        //create iteration node pointer
        node* traverse_position = source_list.first;

        //iterate through, reading from start
        for(int i = 1; i <= source_list.length; ++i){
            //print the character
            out_s << (traverse_position->data);
            traverse_position = traverse_position->next;
        }

        //return the output stream
        return out_s;
    }

我只是在打印时得到废话。它打印出我从未添加到列表中的字符——你知道,只是来自内存中某处的字符。这可能是什么原因造成的?

4

3 回答 3

7

你在哪里分配函数c中的值append()?我担心您可能过于关注双向链表部分,而对存储数据部分关注不够。:)

于 2009-02-20T06:33:13.043 回答
3

正如其他人已经提到的那样,您忘记存储您应该附加的字符。这是一个合理的错误。为了将来避免它,您可以让编译器帮助您。

大多数编译器会针对技术上没问题的事情提供警告,但可能不是您真正想要做的事情。在您的情况下,您声明了 parameter c,但您从未使用过它。启用警告后,您的编译器可能会注意到这一点并告诉您您没有使用它。这可能足以提醒您,您还没有完成编写该函数。

GCC 启用常见警告的选项是-Wall. (这是“警告”的“W”,加上“全部”;它与墙壁无关。但也不是所有的警告。)例如:

g++ -Wall list-program.cpp

其他编译器也有类似的选项。查看编译器的文档以获取详细信息。

于 2009-02-20T08:18:23.803 回答
1

在您的追加方法中,您实际上没有将项目放入新节点中。当您进行打印时,它只会打印该内存位置中发生的任何值(一些随机值)。

于 2009-02-20T06:35:42.663 回答