Preview:
#include <iostream>
#include <fstream>
#include <string>
#include <memory>

struct Node {
    std::string line;
    int number;
    std::shared_ptr<Node> next;
    
    Node(std::string l = "", int n = 0) : line(l), number(n), next(nullptr) {}
};

void read(std::shared_ptr<Node>& root) {
    std::ifstream reader("read.txt");  // cin
    if (reader.is_open() && !reader.eof()) {
        root = std::make_shared<Node>();
        reader >> root->line >> root->number;  
        auto tmp = root;
        
        while(!reader.eof()) {
            tmp->next = std::make_shared<Node>();
            tmp = tmp->next;
            reader >> tmp->line >> tmp->number;
        }
    }
}

void type(std::shared_ptr<Node> root) {
    auto tmp = root;
    while (tmp) {
        std::cout << tmp->line << " " << tmp->number << std::endl;
        tmp = tmp->next;
    }
}

void remove(std::shared_ptr<Node>& root, int const number) {
    
    // for first root
    if (root->number == number) {
        root = root->next;
        return;
    }

    auto tmp = root;
    while (tmp->next && tmp->next->number != number) {
        tmp = tmp->next;
    }

    if (tmp->next) {
        tmp->next = tmp->next->next;
    } else {
        std::cout << "we didn' find this element" << std::endl;
    }
}

void insert(std::shared_ptr<Node>& root, int pos, const std::string& str, int val) {
    if (pos == 0) {
        std::shared_ptr<Node> new_root = std::make_shared<Node>(str, val);
        new_root->next = root;
        root = new_root;
        return;
    }

    auto tmp = root;
    for (int i = 1; tmp && i < pos; ++i) {
        tmp = tmp->next;
    }

    if (tmp) {
        std::shared_ptr<Node> new_node = std::make_shared<Node>(str, val);
        new_node->next = tmp->next;
        tmp->next = new_node;
    } 
}

int main() {
    std::shared_ptr<Node> root;
    
    read(root);
    
    std::cout << "list:" << std::endl;
    type(root);
    
    insert(root, 0, "New first line", 10);
    std::cout << "\nuse insert to put new element to the first root:" << std::endl;
    type(root);

    insert(root, 2, "newline", 20);
    std::cout << "\njust use void insert:" << std::endl;
    type(root);
    
    remove(root, 10);
    std::cout << "\n delete root with value = 10:" << std::endl;
    type(root);


    return 0;
}
downloadDownload PNG downloadDownload JPEG downloadDownload SVG

Tip: You can change the style, width & colours of the snippet with the inspect tool before clicking Download!

Click to optimize width for Twitter