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

関数のどこに値を代入してcappend()ますか? 二重リンクリストの部分に集中しすぎて、データの保存部分に十分に集中していないのではないかと思います。:)

于 2009-02-20T06:33:13.043 に答える
3

他の人がすでに述べたように、追加していると思われる文字を保存するのを忘れていました。それは合理的な間違いです。将来それを避けるために、コンパイラーに助けてもらうことができます。

ほとんどのコンパイラは、技術的には問題ないものの、おそらく本当にやりたいことではないことについて警告を出します。あなたの場合、パラメータを宣言しましたcが、使用したことはありません。警告が有効になっていると、コンパイラはそれに気づき、それを使用していないと通知した可能性があります。それはおそらく、その関数を書き終えていないことを思い出させるのに十分だったでしょう。

一般的な警告を有効にする GCC のオプションは-Wall. (これは、「警告」の「W」に「すべて」を加えたものです。壁とは関係ありません。しかし、実際にはすべての警告ではありません。)たとえば、次のようになります。

g++ -Wall list-program.cpp

他のコンパイラにも同様のオプションがあります。詳細については、コンパイラのドキュメントを確認してください。

于 2009-02-20T08:18:23.803 に答える
1

追加メソッドのどこに実際に項目を新しいノードに配置する必要はありません。印刷すると、そのメモリの場所にある値 (ランダムな値) が印刷されます。

于 2009-02-20T06:35:42.663 に答える