001.单链表的基础操作

单链表节点\(linknode\)包括数据域和指针域

template<typename ElemType>
struct LinkNode
{
    ElemType data;
    LinkNode* next;
    LinkNode() : data(0), next(nullptr) {}
    LinkNode(ElemType val) :data(val), next(nullptr) {}
    LinkNode(ElemType val, LinkNode* Node) : data(val), next(Node) {}
};

单链表的基础操作
(1)创建:Linklist()
(2)销毁:~Linklist()
(3)头插法:void add_from_head(ElemType val)
(4)尾插法:void add_from_rear(ElemType val)
(5)找到值为val的元素:LinkNode<ElemType>* find_val(ElemType val)
(6)第i个节点对应的指针:LinkNode<ElemType>* get_node(int i)
(7)第i个节点对应的元素: bool get_val(int i, ElemType& res)
(8)设置第i个节点的元素:bool set_val(int i, const ElemType& val)
(9)插入节点:bool insert_node(int i, const ElemType& val)
(10)删除节点:bool delete_node(int i)

完整类模板:

template<typename ElemType>
struct LinkNode
{
    ElemType data;
    LinkNode* next;
    LinkNode() : data(0), next(nullptr) {}
    LinkNode(ElemType val) :data(val), next(nullptr) {}
    LinkNode(ElemType val, LinkNode* Node) : data(val), next(Node) {}
};

template<typename ElemType>
class Linklist //带头节点的单链表
{
private:
    LinkNode<ElemType>* head;

public:
    Linklist()
    {
        head = new LinkNode<ElemType>();
    }
    ~Linklist()
    {
        LinkNode<ElemType>* p = head;
        while (p != nullptr)
        {
            LinkNode<ElemType>* temp = p;
            p = p->next;
            delete temp;
        }
    }

    // 尾插法
    void add_from_rear(ElemType val)
    {
        LinkNode<ElemType>* p = head;
        LinkNode<ElemType>* newnode = new LinkNode<ElemType>(val);
        while (p->next != nullptr) p = p->next;
        p->next = newnode;
    }

    // 头插法
    void add_from_head(ElemType val)
    {
        LinkNode<ElemType>* newnode = new LinkNode<ElemType>(val);
        newnode->next = head->next;
        head->next = newnode;
    }

    // 找到元素val,找不到返回nullptr
    LinkNode<ElemType>* find_val(ElemType val)
    {
        LinkNode<ElemType>* p = head->next;
        while (p != nullptr)
        {
            if (p->data == val) return p;
            p = p->next;
        }
        return nullptr;
    }

    // 找到第i个节点对应的指针,找不到返回nullptr
    // i的合法范围是[-1, 链表长度-1],其中i=-1返回头节点
    LinkNode<ElemType>* get_node(int i)
    {
        if (i < -1) return nullptr;
        LinkNode<ElemType>* res = head;
        for (int k = 0; k <= i; k++) {
            if (res == nullptr) return nullptr;
            res = res->next;
        }
        return res;
    }

    // 找到第i个节点对应的元素
    bool get_val(int i, ElemType& res)
    {
        if (i < 0) return false;
        LinkNode<ElemType>* p = get_node(i);
        if (p != nullptr)
        {
            res = p->data;
            return true;
        }
        return false;
    }

    // 设置第i个节点对应的元素
    bool set_val(int i, const ElemType& val)
    {
        if (i < 0) return false;
        LinkNode<ElemType>* p = get_node(i);
        if (p != nullptr)
        {
            p->data = val;
            return true;
        }
        return false;
    }

    // 在第i个节点前插入一个节点作为第i个节点
    // i的合法范围是[0, 链表长度]
    bool insert_node(int i, const ElemType& val)
    {
        if (i < 0) return false;
        LinkNode<ElemType>* p = get_node(i - 1);
        if (p != nullptr)
        {
            LinkNode<ElemType>* newnode = new LinkNode<ElemType>(val);
            newnode->next = p->next;
            p->next = newnode;
            return true;
        }
        return false;
    }

    // 删除第i个节点
    // i的合法范围是[0, 链表长度-1]
    bool delete_node(int i)
    {
        if (i < 0) return false;
        LinkNode<ElemType>* p = get_node(i - 1);
        if (p != nullptr && p->next != nullptr) {
            LinkNode<ElemType>* q = p->next;
            p->next = q->next;
            delete q;
            return true;
        }
        return false;
    }

    // 显示链表内容
    void show()
    {
        cout << "List: ";
        for (LinkNode<ElemType>* p = head->next; p != nullptr; p = p->next)
            cout << p->data << " ";
        cout << endl;
    }
};

测试代码:

int main()
{
    Linklist<int> list;

    // 测试头插法
    list.add_from_head(10);
    list.add_from_head(20);
    list.show(); // 输出: List: 20 10

    // 测试尾插法
    list.add_from_rear(30);
    list.show(); // 输出: List: 20 10 30

    // 测试插入
    list.insert_node(1, 40); // 在位置1插入40
    list.show(); // 输出: List: 20 40 10 30

    // 测试查找
    LinkNode<int>* node = list.find_val(10);
    if (node != nullptr)
        cout << "找到值: " << node->data << endl;

    // 测试删除
    list.delete_node(1); // 删除位置1的元素
    list.show(); // 输出: List: 20 10 30

    return 0;
}

posted @ 2025-06-02 11:42  _P_D_X  阅读(38)  评论(0)    收藏  举报