Как написать функцию, которая возвращает узел, значение которого соответствует значению, хранящемуся в переменной?

#c #linked-list

Вопрос:

Я наткнулся на этот вопрос в старом учебнике, который я купил много лет назад, хотя, строго говоря, это не так уж сложно, я не смог найти здесь сообщение, которое просто ответило бы на этот вопрос. Поэтому я подумал: «Эй, возможно, кто-то начинающий может быть смущен этим», и поэтому я собрал следующий код:

 #include <iostream>

using namespace std;

// Structures
struct charNode {
    char Node;
    charNode *next;
};

// Functions
charNode* getCharNode(char c) {
    return ; //<----- Return Node Here 
}
 

Комментарии:

1. Вероятно, вам просто нужно создать «связанный список». Ищите его, так как есть много учебных пособий.

2. Сами книги, вероятно, должны содержать раздел о связанных списках и о том, как с ними работать, иначе это упражнение было бы бессмысленным.

3. В вашем вопросе отсутствует вопрос. Я сильно сомневаюсь, что «Эй, вот случайный фрагмент кода без каких-либо объяснений, что бы это ни было» кому-нибудь поможет.

Ответ №1:

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

Пример class может выглядеть так:

 #include <iostream>

class singly_linked_list {
    struct charNode {
        char Node;
        charNode *next;
    };

public:
    // find the charNode with the value `c`:
    charNode* getCharNode(char c) {
        for(charNode* curr = head; curr != nullptr; curr = curr->next) {
            if(curr->Node == c) return curr;
        }
        return nullptr;
    }

    // add member functions to add/remove charNode's from the list etc
    // and implement one of "the rule of 3" or "the rule of 5"

private:
    charNode* head = nullptr;
};
 

Ответ №2:

Вы можете реализовать getCharNode() функцию, как в следующем коде. Я использовал эту функцию для примера создания односвязного списка символов. Также создана дополнительная функция print_list() , которая выводит связанный список на консоль.

Обратите внимание, что я выделял только узлы ( new оператор), а не освобождал ( delete ), я оставил эту задачу для вас, если вас волнует утечка памяти.

Попробуйте это онлайн!

 #include <iostream>

// Structures
struct charNode {
    charNode(char value, charNode * _next = nullptr)
        : Node(value), next(_next) {}
    char Node;
    charNode *next;
};

// Functions
charNode* getCharNode(char c, charNode * next = nullptr) {
    return new charNode(c, next);
}

void print_list(charNode const * node) {
    if (!node)
        return;
    std::cout << node->Node << " ";
    print_list(node->next);
}

int main() {
    charNode * list = getCharNode('a',
        getCharNode('b', getCharNode('c')));
    print_list(list);
}
 

Выход:

 a b c
 

Комментарии:

1. @TedLyngmo Во втором абзаце моего ответа я отметил, что эта программа намеренно допустила утечку, чтобы оставить задачу освобождения в качестве домашнего задания, потому что это выходило за рамки первоначального вопроса.

2. Я заметил, поэтому удалил этот комментарий 🙂 Но » если вас волнуют утечки памяти «, вероятно, не очень хорошо говорить кому-то, кто новичок в C .

3. Забавно, как мы getCharNode по-разному интерпретировали это. Я истолковал это как поиск , а вы как создание .

4. @TedLyngmo Обычно все, кто новичок в C , вообще не заботятся об утечках памяти. Даже учителя в школе, которые дают задание, не требуют освобождения, потому что они обычно заботятся о центральном алгоритме запрашиваемой задачи и не заботятся о дополнительных вещах на C , таких как отсутствие утечек. Конечно, в производственном коде очень важно, чтобы не было ни одной утечки.

5. @TedLyngmo Ужасно, но возможно. Я сам помню, что несколько учителей в моей школе и университете никогда не заботились о побочных деталях, не связанных с центральным значением самого алгоритма. Другими словами, они заботились только о математической части кода, например о том, чтобы код выводил правильные числа. Конечно, если урок посвящен исключительно управлению памятью, то он всегда содержит предупреждения об освобождении, а в более сложных случаях-об использовании RAII для безопасного освобождения. Задания в школе очень похожи на задачи онлайн-конкурсов, и многие сайты онлайн-конкурсов вообще не очищают распределение.