c ++ вывод и ввод одного символа - PullRequest
2 голосов
/ 20 февраля 2009

Я пишу программу на 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;
    }

Я просто получаю дерьмо, когда печатаю это. Он печатает символы, которые я никогда не добавлял в свой список - вы знаете, только символы из какого-то места в памяти. Что может быть причиной этого?

Ответы [ 3 ]

7 голосов
/ 20 февраля 2009

Где вы назначаете значение c в функции append()? Я боюсь, что вы, возможно, слишком много сконцентрировались на части двусвязного списка и недостаточно на части хранения данных. :)

3 голосов
/ 20 февраля 2009

Как уже упоминали другие, вы забыли сохранить символы, которые якобы добавляете. Это разумная ошибка. Чтобы избежать этого в будущем, вы можете позволить компилятору помочь вам.

Большинство компиляторов предлагают предупреждения о вещах, которые технически исправны, но, вероятно, не являются тем, что вы действительно хотите сделать. В вашем случае вы объявили параметр c, но никогда не использовали его. С включенными предупреждениями ваш компилятор мог бы заметить это и сказать, что вы его не использовали. Этого, вероятно, было бы достаточно для вас, чтобы напомнить, что вы не закончили писать эту функцию.

Опция GCC для включения общих предупреждений - -Wall. (Это "W" для "предупреждения" плюс "все"; это не имеет ничего общего со стенами. Но на самом деле это не все предупреждения.) Например:

g++ -Wall list-program.cpp

Другие компиляторы имеют аналогичные параметры. Подробности смотрите в документации вашего компилятора.

1 голос
/ 20 февраля 2009

Нет, где в вашем методе добавления вы фактически помещаете элемент в новый узел. Когда вы отправляетесь на печать, он просто печатает любое значение, которое окажется в этой ячейке памяти (какое-то случайное значение).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...