Ailurus_styani 2025-06-29 22:03 采纳率: 66.7%
浏览 11

C++链表与智能指针


class linked_list {
    private:
        struct Node {
            int value = 0;
            weak_ptr<Node> prev;
            shared_ptr<Node> next = nullptr;
        };
        shared_ptr<linked_list::Node> guard = make_shared<linked_list::Node>();
        shared_ptr<Node> locate(int);
    public:
        shared_ptr<Node> insert(int, int);
        shared_ptr<Node> search(int);
        bool remove(int);
        shared_ptr<Node> set_value(int, int);
        bool is_empty();
        shared_ptr<Node> reverse();
        void show(bool);
        Node &operator [](int);
};

shared_ptr<linked_list::Node> linked_list::locate(int seq) {
    if (abs(seq) > guard->value) abort();
    auto p = guard;
    if (seq >= 0) {
        for (int i = 0; i < seq; i++) p = p->next;
    }
    else {
        p = p->next;
        for (int i = -seq; i > 0; i--) p = p->prev.lock();    
    }
    return p;
}

shared_ptr<linked_list::Node> linked_list::insert(int seq, int value) {
    if (abs(seq) <= guard->value + 1) guard->value++;
    shared_ptr<Node> p = nullptr;
    if (seq > 0) p = locate(--seq);
    else p = locate(seq);
    if (p == guard) {
        p->next = make_shared<Node>(value);
        p->next->next = p->next;
        p->next->prev = p->next;
    }
    else {
        auto q = p->next;
        p->next = make_shared<Node>(value);
        p->next->prev = p;
        p->next->next = q;
        q->prev = p->next;
    }
    return p->next;
}

int main() {
    linked_list m;
    m.insert(-1, 2);
    cout << "reverse: " << endl;
}

macbook报错,提示

zsh: segmentation fault

  • 写回答

7条回答 默认 最新

  • 阿里嘎多学长 2025-06-29 22:03
    关注

    阿里嘎多学长整理AIGC生成,因移动端显示问题导致当前答案未能完全显示,请使用PC端查看更加详细的解答过程

    解答

    你遇到了C++链表与智能指针的问题。weak_ptr是C++11中引入的智能指针类型,它可以指向一个对象,但是不会增加对象的引用计数。weak_ptr通常用于解决循环引用问题。

    在你的代码中,你使用了weak_ptr来指向链表中的每个节点,但是你可能遇到了问题,因为weak_ptr不能直接访问对象的成员变量。

    解决方案是使用lock函数来获取weak_ptr指向的对象的shared_ptr,然后可以访问对象的成员变量。例如:

    class linked_list {
    private:
        struct Node {
            int value = 0;
            weak_ptr<Node> next;
        };
    
    public:
        void addNode(int value) {
            Node* node = new Node();
            node->value = value;
            node->next = weak_ptr<Node>(shared_ptr<Node>(node));
            // ...
        }
    };
    

    在上面的代码中,我们使用weak_ptr来指向链表中的每个节点,然后使用lock函数来获取weak_ptr指向的对象的shared_ptr。这样我们就可以访问对象的成员变量了。

    需要注意的是,weak_ptr不能直接访问对象的成员变量,因为它不持有对象的所有权。如果你需要访问对象的成员变量,需要使用lock函数来获取shared_ptr。

    评论

报告相同问题?

问题事件

  • 创建了问题 6月29日