#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 для безопасного освобождения. Задания в школе очень похожи на задачи онлайн-конкурсов, и многие сайты онлайн-конкурсов вообще не очищают распределение.